2009-02-26 4 views
5

È possibile solo se rinominare il file? Oppure esiste una variabile __module__ nel file per definire qual è il suo nome?Come cambiare il nome di un modulo Python?

+0

Qual è il problema con la ridenominazione del file? Perché non rinominare il lavoro? –

+0

In realtà, era solo pigrizia ... Non volevo rimuovere e aggiungere di nuovo il file su Launchpad. – Rodrigo

risposta

8

Sì, è necessario rinominare il file. La cosa migliore sarebbe dopo aver fatto ciò per rimuovere i file compilati oldname.pyc e oldname.pyo (se presenti) dal tuo sistema, altrimenti il ​​modulo sarà importabile anche con il vecchio nome.

0

Ogni classe ha una proprietà __module__, anche se credo che la modifica non cambierà lo spazio dei nomi della Classe.

Se è possibile, probabilmente richiederebbe l'uso di setattr per inserire i metodi o la classe nel modulo desiderato, sebbene si rischia di rendere il proprio codice molto confuso con i futuri colleghi.

La soluzione migliore è rinominare il file.

0

Dove ti piacerebbe avere questa variabile __module__, quindi lo script originale sa cosa importare? I moduli sono riconosciuti dai nomi dei file e hanno cercato i percorsi definiti nella variabile sys.path.

Quindi, è necessario rinominare il file, quindi rimuovere lo oldname.pyc, solo per assicurarsi che tutto funzioni correttamente.

17

Se davvero si vuole importare il file 'oldname.py' con l'affermazione 'importazione newname', c'è un trucco che rende possibile: importare il modulo qualche parte con il vecchio nome, poi iniettare in sys.modules con il nuovo nome. Le istruzioni di importazione successive lo troveranno anche sotto il nuovo nome. Esempio di codice:

# this is in file 'oldname.py' 
...module code... 

Usage:

# inject the 'oldname' module with a new name 
import oldname 
import sys 
sys.modules['newname'] = oldname 

Ora è possibile ovunque il modulo con import newname.

+0

Non riesco a pensare a una situazione in cui vorrei farlo, ma è bello che tu possa :) – technomalogical

+1

Una situazione: un progetto in cui si desidera la compatibilità sia con python 2.6 e 2.7, ma si vuole usare qualche nuovo 2.7 funzionalità di unittest. Questo trucco ci consente di utilizzare il codice semplicemente "import unittest" mentre si utilizza ancora la nuova funzionalità, quindi non abbiamo avuto bisogno di modificare una serie di istruzioni import ogni volta che si cambia versione di Python. – Tobi

11

È possibile modificare il nome usato per un modulo durante l'importazione utilizzando come:

import foo as bar 
print bar.baz 
1

Quando si esegue import module_name l'interprete Python cerca un file module_name.extension in PYTHONPATH. Quindi non c'è chaging di quel nome senza cambiare nome al file. Ma naturalmente si può fare:

import module_name as new_module_name 

o anche

import module_name.submodule.subsubmodule as short_name 

utile ad es. per scrivere il codice DB.

import sqlite3 as sql 
sql.whatever.. 

E quindi passare ad es. sqlite3 a pysqlite è sufficiente modificare la riga di importazione

0

Ho avuto un problema simile a questo con bsddb. Sono stato costretto ad installare il modulo bsddb3 ma centinaia di script hanno importato bsddb. Invece di cambiare l'importazione in tutti loro, ho estratto l'uovo bsddb3 e ho creato un soft link nella directory dei pacchetti del sito in modo che sia "bsddb" sia "bsddb3" fossero uno nella stessa cosa per python.