Как исправить ошибку «ImportError: модуль без имени ...» в Python? - PullRequest
99 голосов
/ 24 февраля 2010

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

Ответы [ 6 ]

105 голосов
/ 24 февраля 2010

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

31 голосов
/ 24 февраля 2010

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

Дополнительную информацию смотрите в разделе о пакетах в руководстве по python.

7 голосов
/ 25 октября 2011

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

  1. Добавьте скрипт с именем run.py в /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 будут найдены.

6 голосов
/ 01 августа 2014

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

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

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
    
  2. Затем свяжите нужную библиотеку в папку ~ / .python, например,

    ln -s /home/user/work/project/foo ~/.python/
    
2 голосов
/ 17 июля 2017

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

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

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

2 голосов
/ 24 февраля 2010

По моему мнению, папка foo является автономной библиотекой. Я мог бы захотеть переместить его в папку Lib\site-packages внутри установки Python. Возможно, я захочу добавить туда файл foo.pth.

Я знаю, что это библиотека, поскольку ./programs/my_python_program.py содержит следующую строку:

from foo.tasks import my_function

Так что не имеет значения, что ./programs является папкой-родителем для ./foo Это факт, что my_python_program.py запускается как скрипт:

python ./programs/my_python_program.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...