2012-01-30 11 views
9

Czy istnieje sposób na import modułów z zależnościami w tym samym katalogu przy użyciu bezwzględnej/względnej ścieżki z "imp"?Jak importować moduły z zależnościami w tej samej bezwzględnej/względnej ścieżce z imp?

Tu następuje strukturę katalogów:

. 
├── importFrom 
│   ├── dependant.py 
│   └── dependence.py 
└── test.py 

import plików test.py dependant.py używając:

modname=imp.load_source("testImp","importFrom/dependant.py") 

co z kolei import dependence.py direcly z:

import dependence 

Wywołanie test.py daje

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    modname=imp.load_source("testImp","importFrom/dependant.py") 
    File "importFrom/dependant.py", line 1, in <module> 
    import dependence 
ImportError: No module named dependence 

Warto mieć opcję load_source, aby dodać ścieżkę do załadowanego modułu do modułu ładującego, aby automatycznie wykryć relatywne zależności. Na razie jedyną alternatywą znalazłem jest dodanie do ścieżki systemowej, wprowadzanie do test.py

EDIT: Znalazłem lepszy sposób to zrobić względną import z drogi, dodał plik, aby uzyskać ścieżka bezwzględna dzwoniącego (niezależność od aktualnego katalogu roboczego)

sys.path.append(os.path.join(os.path.dirname(__file__), 'importFrom')) 
import dependant 

Odpowiedz

0

IMO nie jest to możliwe z load_source, które nie robi niezbędnych rzeczy, aby import w pliku "dependant.py" uwzględniał jego katalog nadrzędny.

Powinieneś albo robić to, co sugerowano (__init__.py w katalogu i absolutnej importu w module), lub użyć niższego poziomu funkcji find_module/load_module który umożliwia tego rodzaju rzeczy (patrz find_module „ścieżkę” argument)

+0

Używanie tup = imp.find_module ("dependent", ["/ opt/importFrom /", "other"]) imp.load_module ("dependent", tup [0], tup [1], tup [2]) podaje ten sam błąd "Brak zależności od modułu". – a1an

+0

Też myślę, że to nie jest wykonalne z load_source od python 2.7, stąd poprawna odpowiedź jest "niewykonalna", musi użyć podejścia obejścia – a1an

0

trzeba mieć __init__.py w importFrom katalogu.

In [5]: ls importFrom/ 
dependance.py dependant.pyc dependence.pyc __init__.pyc 
dependant.py dependence.py __init__.py 

In [6]: from importFrom import dependant 

In [7]: dependant.dependence 
Out[7]: <module 'importFrom.dependence' from 'importFrom/dependence.py'> 

Zamiast importowania dependant w test, Użyłem interpreter Pythona pokazać wyjście. W pliku dependant.py, zaimportowano dependance.

+1

Pozwala to uniknąć dodawania do ścieżki standardowego importu, nadal nie działa z imp.load_source, ponadto myślę, że nie działałoby również, gdyby moduł do zaimportowania znalazł się w zupełnie innym katalogu – a1an

+0

do utworzenia pliku __init__.py w katalogu importFrom? – Kracekumar

+0

Utworzyłem __init__.py i umieściłem plik import.From.2.2 w pliku test.py, który działa. Nadal działa, ponieważ katalog importFrom jest bezpośrednim potomkiem katalogu zawierającego test.py. Bezwzględna ścieżka do niego nie może być określona w standardowym imporcie. – a1an

Powiązane problemy