2015-03-16 2 views
5

Ich habe dieses Setup:imp.load_source eine andere Datei als Py, aber ein Py gibt es auch in diesem Verzeichnis

Datei: a.ext1 a.py

a.ext1 ein lädt. py aus irgendeinem Grund, aber als Engine muss ich Datei a.ext1 laden.

Ich kann es in Py3 gut funktionieren, aber ich kann es nicht in Py2 arbeiten.

Hier ist meine Python2 Versuch: ** Dies ist der Hauptfluss, natürlich gibt es mehr Code um ihn herum.

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) 

Jetzt, wenn ich es tue; x, wird es mir sagen:

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

aber wenn ich mich (x) zu tun, es gibt mir die Sachen aus a.py. Ich möchte, dass es mir die Sachen aus einer Datei von .ext1 gibt.

Wie kann ich das auf Py2 arbeiten?

Hier ist, wie es auf py3 funktioniert:

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() 

Jetzt x genau ist, was ich will, die a.ext1-Datei und nicht die Py

Jede Idee, wie ich diese Arbeit bekommen kann für py2?

(BTW habe ich alle gelesen ich zu diesem Thema auf Stack-Überlauf finden konnte, aber es war nie der Fall, wo ein Py auch bestanden)

Antwort

0

Keine Ahnung über den Hokuspokus mit leeren Erstellen von Modulen und Anhängen von Pfaden , aber das Gleiche funktioniert für mich am 2.7. Es sollte definitiv kein Problem mit einem einfachen Standalone-Beispiel geben.

Ich würde sagen, Ihr a.py wird auch geladen my.name.space.a, an anderer Stelle im Programm, in welchem ​​Fall es Inhalt Zusammenstoß mit dem, was sonst Sie laden unter dem gleichen Modulnamen ist. Es kann nur zu einem Zeitpunkt eine einzige globale Modul Instanz eines Vornamens, zB:

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'] 
Verwandte Themen