Як виправити помилку "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скрипт

Відповіді:


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
Щоб додати поточний dir на python path, використовуйтеexport PYTHONPATH=`pwd`
rodorgas

1
Що для мене спрацювало - додати до $ PYTHONPATH батьківський каталог проекту, у вашому випадку буде: /home/bodacydo/work... дивіться цю відповідь
maledr53

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. І voilà , import foo.tasksзнайдеться.


8

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

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

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. Потім зв’яжіть потрібну бібліотеку у папку ~ / .python, наприклад

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

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


0

Якщо у вас є ця проблема при використанні встановленої версії, під час використання setup.pyпереконайтесь, що ваш модуль включений всерединуpackages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.