Non è chiaro cosa si sta tentando di fare nel proprio spazio dei nomi locale. Immagino tu voglia solo il my_method
come locale, digitando output = my_method()
?
# This is equivalent to "from a.b.myfile import my_method"
the_module = importlib.import_module("a.b.myfile")
same_module = __import__("a.b.myfile")
# import_module() and __input__() only return modules
my_method = getattr(the_module, "my_method")
# or, more concisely,
my_method = getattr(__import__("a.b.myfile"), "my_method")
output = my_method()
Mentre si aggiunge solo my_method
al namespace locale, tu caricare la catena di moduli. Puoi guardare le modifiche guardando i tasti di sys.modules
prima e dopo l'importazione. Spero che questo sia più chiaro e più accurato delle altre risposte.
Per completezza, è così che si aggiunge l'intera catena.
# This is equivalent to "import a.b.myfile"
a = __import__("a.b.myfile")
also_a = importlib.import_module("a.b.myfile")
output = a.b.myfile.my_method()
# This is equivalent to "from a.b import myfile"
myfile = __import__("a.b.myfile", fromlist="a.b")
also_myfile = importlib.import_module("a.b.myfile", "a.b")
output = myfile.my_method()
E, infine, se si utilizza __import__()
e avete modificato si cerca percorso dopo il programma è stato avviato, potrebbe essere necessario utilizzare __import__(normal args, globals=globals(), locals=locals())
. Il perché è una discussione complessa.
fonte
2013-06-07 04:50:50
io uso 2.6.5. Posso fare una cosa 'from __future__'? –
No, '__future__' è per le funzionalità della lingua, non per i nuovi moduli stdlib. – ThiefMaster
Usa il buit-in '__import__' come negli esempi sopra. Funziona a 2,5 e, senza parole chiave, prima di quello. –