Как исправить ошибку "ImportError: no module named ..." в Python?



Как правильно исправить эту ошибку 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


The ./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 сценарий.

7234   6  

6 ответов:

Python не добавляет текущий каталог в sys.path, но скорее каталог, в котором находится скрипт. Добавить /home/bodacydo/work/project или sys.path или $PYTHONPATH.

у вас есть файл с названием __init__.py в каталоге foo? Если нет, то python не распознает foo как пакет python.

посмотреть пакетов в учебнике python для получения дополнительной информации.

вот пошаговое решение:

  1. добавить скрипт под названием run.py in /home/bodacydo/work/project и редактировать его так:

    import programs.my_python_program
    programs.my_python_program.main()
    

    (вместо main() с эквивалентным методом в my_python_program.)

  2. на /home/bodacydo/work/project
  3. выполнить run.py

объяснение: Поскольку python добавляет к PYTHONPATH путь скрипт, из которого он запускается, работает run.py будет добавлять /home/bodacydo/work/project. И вуаля,import foo.tasks будут найдены.

пример решения для добавления библиотеки в PYTHONPATH.

  1. добавьте следующую строку в ваш ~/.bashrc или просто запустить его напрямую:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
    
  2. затем свяжите необходимую библиотеку с вашим~/.папка 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 выполняется как a сценарий такой:

python ./programs/my_python_program.py

A лучше исправить, чем параметр PYTHONPATH использовать python -m module.path

это будет правильно установить sys.path[0] и является более надежным способом для выполнения модулей.

у меня есть быстрая рецензия об этой проблеме, как и другие ответчики упомянули причина для этого python path/to/file.py ставит path/to в начале PYTHONPATH (sys.path).

Comments

    Ничего не найдено.