2015-03-16 8 views
5

mam tej konfiguracji:imp.load_source inny plik niż .py, ale .py istnieją również w tym katalogu

Plik: a.ext1 a.py

a.ext1 ładuje a. py z jakiegoś powodu, ale jako silnik muszę załadować plik a.ext1.

Mogę sprawić, że działa dobrze w py3, ale nie mogę go uruchomić w py2.

Oto moja próba python2: ** To jest główny strumień, oczywiście jest więcej kodu wokół niego.

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) 

Teraz, jeśli to zrobię; x, powie mi:

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

, ale jeśli robię dir (x), to daje mi rzeczy z a.py. Chcę, żeby dała mi rzeczy z pliku a.ext1.

Jak mogę uzyskać to działa na py2?

Oto jak to działa na 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() 

Teraz x jest dokładnie to, co chcę, pliku a.ext1, a nie .py

Każdy pomysł w jaki sposób można uzyskać tej pracy dla py2?

(Btw czytałem wszystko udało mi się znaleźć na ten temat na przepełnienie stosu, ale to nie był przypadek, gdy .py istniał również)

Odpowiedz

0

Nie wiem o ple ple z tworzenia pustych modułów i dodanie ścieżki , ale to samo działa dobrze dla mnie w 2.7. Zdecydowanie nie powinno być problemu z prostym, samodzielnym przykładem.

powiedziałbym swoje a.py jest ładowany do my.name.space.a, jak również, w innym miejscu w programie, w którym to przypadku jego zawartość zderzenie z czegokolwiek innego załadować pod tą samą nazwą modułu. Nie może być tylko jeden globalny przykład moduł danej nazwy w czasie, na przykład:

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