Jaki jest właściwy sposób naprawienia tego błędu ImportError?
Mam następującą strukturę katalogów:
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
Jestem w katalogu
/home/bodacydo/work/project
Teraz, jeśli napiszę
python ./programs/my_python_program.py
Natychmiast rozumiem
ImportError: No module named foo.tasks
./programs/my_python_program.py
Zawiera następujący wiersz:
from foo.tasks import my_function
Nie mogę zrozumieć, dlaczego Python nie znajdzie ./foo/tasks.py
- jest.
Jeśli zrobię to z powłoki Pythona, to działa:
python
>>> from foo.tasks import my_function
Nie działa tylko wtedy, gdy wywołuję to za pomocą python ./programs/my_python_program.py
skryptu.
__init__.py
wskazuje, że katalog powinien być traktowany jako pakiet, gdy jego element nadrzędnysys.path
znajduje się w pakiecie lub sam jest pakietem.export PYTHONPATH=`pwd`
/home/bodacydo/work
Czy masz plik o nazwie
__init__.py
w katalogu foo? Jeśli nie, to python nie rozpozna foo jako pakietu Pythona.Zobacz sekcję dotyczącą pakietów w samouczku Pythona, aby uzyskać więcej informacji.
źródło
__init__.py
. Tym razem był problem$PYTHONPATH
. Rozwiązanie Ignacio zadziałało.Oto rozwiązanie krok po kroku:
Dodaj skrypt o nazwie
run.py
w/home/bodacydo/work/project
i edytować go tak:(zastąp
main()
swoją równoważną metodą wmy_python_program
.)/home/bodacydo/work/project
run.py
Objaśnienie: Ponieważ python dołącza do PYTHONPATH ścieżkę do skryptu, z którego jest uruchamiany , uruchomiony
run.py
zostanie dołączony/home/bodacydo/work/project
. I voila ,import foo.tasks
zostanie znalezione.źródło
Przykładowe rozwiązanie dodawania biblioteki do PYTHONPATH.
Dodaj następujący wiersz do swojego ~ / .bashrc lub po prostu uruchom go bezpośrednio:
Następnie połącz wymaganą bibliotekę z folderem ~ / .python, np
źródło
Lepiej naprawić niż ustawienie
PYTHONPATH
jest użyciepython -m module.path
To będzie poprawnie ustawione
sys.path[0]
i będzie bardziej niezawodnym sposobem wykonywania modułów.Mam krótki opis tego problemu, ponieważ inni respondenci wspomnieli, że przyczyna tego jest
python path/to/file.py
umieszczonapath/to
na początkuPYTHONPATH
(sys.path
).źródło
Myślę, że muszę wziąć pod uwagę, że
foo
folder jest samodzielną biblioteką. Mogę rozważyć przeniesienie go doLib\site-packages
folderu w instalacji Pythona. Mogę rozważyć dodanie tamfoo.pth
pliku.Wiem, że to biblioteka, ponieważ
./programs/my_python_program.py
zawiera następujący wiersz:Więc nie ma znaczenia, że
./programs
jest to folder rodzeństwa./foo
. To fakt, żemy_python_program.py
jest uruchamiany jako taki skrypt:źródło
Jeśli masz ten problem podczas korzystania z zainstalowanej wersji,
setup.py
upewnij się, że moduł jest zawarty w środkupackages
źródło