2012-02-24 11 views
11

Wiem, że istnieje mnóstwo podobnych pytań na temat przepełnienia stosu. Ale wspólna odpowiedź nie działa dla mnie.ścieżka względna nie działa nawet z __init__.py

Mam strukturę plików jak to

proj/ 
     lib/ 
      __init__.py 
      aa.py 
      bb.py 
      test/ 
       __init__.py 
       aa_test.py 

Pomyślałem, że gdybym to kod w moim test.py

import lib.aa 

lub

from lib import aa 

byłbym w stanie w odniesieniu do modułów w katalogu lib/. Ale to nie zadziałało.

Więc próbowałem dodać do ścieżki, a to dodaje go poprawnie:

os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..","")) 
print os.environ["PATH"] 

ale nawet teraz, gdy próbuję sprawozdań importu nad ... Dostaję błąd

ImportError: No module named aa 

lub

ImportError: Importing from non-package <Something...> 

Czy jest coś oczywistego, czego mi brakuje?

Czy istnieje sposób sprawdzenia, czy poprawnie skonfigurowałem pliki __init__.py, czy też mogę zobaczyć hierarchię pakietów?

Odpowiedz

13

Musisz zaktualizować swój sys.path, gdzie pyton szuka modułów, w przeciwieństwie do ścieżki twojego systemu w bieżącym środowisku, do czego odnosi się os.environ["PATH"].

Przykład:

import os, sys 
sys.path.insert(0, os.path.abspath("..")) 
import aa 

Po wykonaniu tej czynności można użyć funkcji w aa tak: aa.myfunc()

Jest trochę więcej informacji w accepted answer do zmiennej PATH python: import a module from a directory

2

Katalog lib musi znajdować się w ścieżce szukania modułu Pythona, co nie jest tym samym, co ścieżka wyszukiwania używana przez powłokę.

to prawdopodobnie będzie działać dla Ciebie:

import sys, os 
sys.path.append(os.path.abspath("..")) 

Jednak to chyba lepiej, aby uruchomić kod z sytuacji, w której pakiet lib jest już na ścieżce. Takich jak z katalogu "proj".

1

Gdzie jest kod, z którego próbujesz zaimportować lib.aa? Zgaduję/proj/nie jest twoim katalogiem roboczym i musiałby być teraz tak jak jest skonfigurowany. Zamiast PATH, chciałbyś dodać swój katalog do PYTHONPATH, aby pojawił się w ścieżce wyszukiwania dla importu. Zobacz http://docs.python.org/tutorial/modules.html#the-module-search-path

Także, proszę spojrzeć na http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html To zdecydowanie zaleca umieścić dodatkowy poziom katalogu w miejscu, więc zamiast lib.aa, byś o nim jako my_proj.lib.aa.

0

system nie jest używane przez instrukcję importowania Pythona. Używa PYTHONPATH, ale najlepszym sposobem dodania nowego katalogu do importowania ścieżki wyszukiwania jest zmodyfikowanie sys.path.

Jeśli to nie pomoże, dodaj do pytania wartość sys.path i wartość zwróconą przez os.getcwd().

0

Miałem podobne problemy i oto moja rada.

Zamiast zmieniać sys.path, lepiej uruchomić plik test.py z katalogu proj (np. Katalog główny projektu). W ten sposób katalog projektu automatycznie pojawi się w sys.path i będzie można zaimportować pakiet lib.

Użyj bezwzględnego importu.