Как исправить ошибку «ImportError: Нет модуля с именем…» в Python?

115

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

Я не могу понять, почему питон не находит ./foo/tasks.py- он там.

Если я сделаю это из оболочки Python, то все заработает:

python
>>> from foo.tasks import my_function

Это не работает, только если я вызываю это через python ./programs/my_python_program.pyскрипт.

Bodacydo
источник

Ответы:

121

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

Игнасио Васкес-Абрамс
источник
9
Так какой тогда смысл иметь init .py в корневой папке? Кажется, что это бесполезно, если вы редактируете sys.path или pythonpath.
11
@Editor: __init__.pyуказывает только на то, что каталог следует рассматривать как пакет, если его родительский sys.pathэлемент находится в пакете или сам является пакетом.
Игнасио Васкес-Абрамс,
3
Кроме того, проверьте права доступа к папке. В этом была проблема в моем случае.
SidJ
15
Чтобы добавить текущий export PYTHONPATH=`pwd`
rodorgas
1
Что сработало для меня, так это добавить в $ PYTHONPATH родительский каталог проекта, в вашем случае это будет: /home/bodacydo/work... см. Этот ответ
maledr53 03
33

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

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

Дэйв Кирби
источник
Спасибо, и да, это было __init__.py. На этот раз проблема была с $PYTHONPATH. Решение Игнасио сработало.
bodacydo
1
В инициализации файлов .py требуется , чтобы Python лечить каталоги как содержащие пакеты; это сделано для того, чтобы каталоги с общим именем, таким как строка, случайно не скрывали допустимые модули, которые появляются позже на пути поиска модулей. В простейшем случае init .py может быть просто пустым файлом
panofish
Спасибо, что спасли меня когда-нибудь.
cpu_meltdown
9

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

  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будет найдено.

киборг
источник
8

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

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

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

    ln -s /home/user/work/project/foo ~/.python/
Kenorb
источник
6

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

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

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

Энтони Соттиле
источник
2

На мой взгляд, я должен учитывать, что 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

quamrana
источник
0

Если у вас есть эта проблема при использовании установленной версии setup.py, убедитесь, что ваш модуль включен вpackages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
Данон
источник