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

./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.

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

  • Добавьте 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.

Ответ 4

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

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

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

    ln -s /home/user/work/project/foo ~/.python/
    

Ответ 5

В моем сознании я должен учитывать, что папка 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

Ответ 6

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

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

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