2015-03-16 7 views
5

Ho questa messa a punto:imp.load_source un altro file di .py, ma un .py esistono anche in quella directory

File: a.ext1 a.py

a.ext1 carica un. py per qualche motivo, ma come motore ho bisogno di caricare il file a.ext1.

Posso farlo funzionare bene in py3, ma non riesco a farlo funzionare in py2.

Ecco il mio tentativo python2: ** Questo è il flusso principale, ovviamente c'è più codice attorno ad esso.

file = os.path.abspath(os.path.expanduser('a.ext1') 
directory = os.path.dirname(file) 
sys.path.append(directory) 
fullname = 'my.name.space.a' 
sys.modules['my.name.space'] = imp.new_module('my.name.space') 
x = imp.load_source(fullname,file) 

Ora, se lo faccio; x, essa mi dirà:

module 'my.name.space' from '<path>/a.ext1' 

ma se lo faccio dir (x), mi dà la roba da a.py. Voglio che mi dia le cose da un file .ext1.

Come posso farlo funzionare su py2?

Ecco come funziona su PY3:

file = os.path.abspath(os.path.expanduser('a.ext1')) 
directory = os.path.dirname(file) 
sys.path.append(directory) 
fullname = 'my.name.space.a' 
loader = importlib.machinery.SourceFileLoader(fullname = fullname, 
               path = file) 
x = loader.load_module() 

ora x è esattamente quello che voglio, il file a.ext1, e non il .py

Qualsiasi idea di come posso ottenere questo lavoro per py2?

(Btw ho letto tutto quello che ho potuto trovare su questo argomento su Stack Overflow, ma non è mai il caso in cui un .py anche esistito)

risposta

0

Boh sulla Mumbo Jumbo con la creazione di moduli vuoti e aggiungendo percorsi , ma lo stesso funziona bene per me al 2.7. Sicuramente non dovrebbe esserci un problema con un semplice esempio standalone.

direi che il tuo a.py viene caricato in my.name.space.a così, altrove nel programma, nel qual caso il suo contenuto scontro con qualsiasi altra cosa si carica sotto lo stesso nome del modulo. Ci può essere solo una singola istanza modulo globale di un nome alla volta, ad esempio:

a.py:

py_stuff = 1 

a.ext1

ext1_stuff = 1 

test-ok.py:

import imp 

x = imp.load_source('a', 'a.ext1') 

print(x) # <module 'a' from 'a.ext1'> 
print(dir(x)) # ['__builtins__', ..., 'ext1_stuff'] 

test-not-ok.py:

import imp 

import a 

x = imp.load_source('a', 'a.ext1') 

print(x) # <module 'a' from 'a.ext1'> 
print(dir(x)) # ['__builtins__', ..., 'ext1_stuff', 'py_stuff']