Ответ 1
Python не добавляет текущий каталог в sys.path
, а скорее каталог, в котором находится script. Добавьте /home/bodacydo/work/project
в sys.path
или $PYTHONPATH
.
Каков правильный способ исправить эту ошибку ImportError?
У меня есть следующая структура каталогов:
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
И я в каталоге
/home/bodacydo/work/project
Теперь, если я набираю
python ./programs/my_python_program.py
Я мгновенно получаю
ImportError: No module named foo.tasks
./programs/my_python_program.py
содержит следующую строку:
from foo.tasks import my_function
Я не могу понять, почему python не найдет ./foo/tasks.py
- там.
Если я делаю это из оболочки Python, то он работает:
python
>>> from foo.tasks import my_function
Это только не работает, если я вызываю его через python ./programs/my_python_program.py
script.
Python не добавляет текущий каталог в sys.path
, а скорее каталог, в котором находится script. Добавьте /home/bodacydo/work/project
в sys.path
или $PYTHONPATH
.
У вас есть файл с именем __init__.py
в каталоге foo? Если нет, то python не будет распознавать foo как пакет python.
Дополнительную информацию см. в разделе в пакетах в учебнике python.
Вот пошаговое решение:
Добавьте script под названием run.py
в /home/bodacydo/work/project
и отредактируйте его следующим образом:
import programs.my_python_program programs.my_python_program.main()
(замените main()
на ваш эквивалентный метод в my_python_program
.)
/home/bodacydo/work/project
run.py
Объяснение:
Поскольку python добавляет к PYTHONPATH путь к script, с которого он запускается, запуск run.py
будет добавлять /home/bodacydo/work/project
. И будет найден wilà, import foo.tasks
.
Пример решения для добавления библиотеки в ваш PYTHONPATH.
Добавьте следующую строку в ваш ~/.bashrc или просто запустите ее напрямую:
export PYTHONPATH="$PYTHONPATH:$HOME/.python"
Затем свяжите свою нужную библиотеку с папкой ~/.python, например
ln -s /home/user/work/project/foo ~/.python/
В моем сознании я должен учитывать, что папка foo
представляет собой автономную библиотеку. Возможно, мне захочется переместить его в папку Lib\site-packages
в рамках установки python. Возможно, мне захочется добавить туда файл foo.pth
.
Я знаю, что это библиотека, поскольку ./programs/my_python_program.py
содержит следующую строку:
from foo.tasks import my_function
Поэтому не имеет значения, что ./programs
- это папка для сиблинга ./foo
. Это факт, что my_python_program.py
выполняется как script следующим образом:
python./programs/my_python_program.py
Лучшим решением, чем установка PYTHONPATH
, является использование python -m module.path
Это правильно установит sys.path[0]
и станет более надежным способом выполнения модулей.
У меня есть quick writeup об этой проблеме, поскольку другие ответчики упомянули, что причина этого - python path/to/file.py
puts path/to
on начало PYTHONPATH
(sys.path
).