Ошибка Python "ImportError: модуль не указан" - PullRequest
374 голосов
/ 04 декабря 2008

Python установлен в локальном каталоге.

Мое дерево каталогов выглядит так:

(local directory)/site-packages/toolkit/interface.py

Мой код здесь:

(local directory)/site-packages/toolkit/examples/mountain.py

Для запуска примера я пишу python mountain.py, и в коде у меня есть:

from toolkit.interface import interface

И я получаю ошибку:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Я уже проверил sys.path и там у меня есть каталог /site-packages. Кроме того, у меня есть файл __init__.py.bin в папке набора инструментов, чтобы указать Python, что это пакет. У меня также есть __init__.py.bin в каталоге примеров.

Я не знаю, почему Python не может найти файл, когда он находится в sys.path. Есть идеи? Это может быть проблема с разрешениями? Нужно ли мне разрешение на исполнение?

Ответы [ 25 ]

235 голосов
/ 04 декабря 2008

Судя по вашим комментариям к посту Орипа, вот что произошло:

  1. Вы редактировали __init__.py в Windows.
  2. Редактор Windows добавил что-то непечатное, возможно, возврат каретки (конец строки в Windows - CR / LF; в unix - только LF), или, возможно, CTRL-Z (конец окна - файл).
  3. Вы использовали WinSCP, чтобы скопировать файл в вашу коробку Unix.
  4. WinSCP подумал: «У этого есть что-то, что не является основным текстом; я добавлю расширение .bin, чтобы указать двоичные данные».
  5. Отсутствующий __init__.py (теперь называется __init__.py.bin) означает, что python не понимает инструментарий как пакет.
  6. Вы создаете __init__.py в соответствующем каталоге и все работает ...?
59 голосов
/ 04 декабря 2008

ли

(local directory)/site-packages/toolkit

есть __init__.py?

Чтобы сделать импорт обходом через ваши каталоги, в каждом каталоге должен быть файл __init__.py.

38 голосов
/ 05 марта 2011

На * nix, также убедитесь, что PYTHONPATH настроен правильно, особенно что он имеет этот формат:

 .:/usr/local/lib/python

(Помните .: в начале, чтобы он мог искать и в текущем каталоге.)

Может также быть в других местах, в зависимости от версии:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
35 голосов
/ 22 апреля 2014

Я столкнулся с чем-то очень похожим, когда делал это упражнение в LPTHW; Я никогда не мог заставить Python распознать, что у меня есть файлы в каталоге, из которого я звонил. Но я смог заставить его работать в конце. То, что я сделал, и что я рекомендую, это попробовать это:

(ПРИМЕЧАНИЕ. Из вашего первоначального поста я предполагаю, что вы используете машину на базе * NIX и запускаете что-то из командной строки, так что этот совет адаптирован к этому. Поскольку я запускаю Ubuntu, это то, что я сделал )

1) Измените каталог (cd) на каталог выше каталога, в котором находятся ваши файлы. В этом случае вы пытаетесь запустить файл mountain.py и пытаетесь вызвать модуль toolkit.interface.py, которые находятся в отдельных каталогах. В этом случае вы перейдете в каталог, содержащий пути к обоим этим файлам (или, другими словами, в ближайший каталог, к которому относятся пути обоих этих файлов). В данном случае это каталог toolkit.

2) Когда вы находитесь в каталоге tookit, введите следующую строку кода в командной строке:

export PYTHONPATH=.

Это устанавливает для PYTHONPATH значение ".", Что в основном означает, что теперь PYTHONPATH будет искать любые вызываемые файлы в каталоге, в котором вы находитесь в данный момент (и более того, в ветвях подкаталога ) 1019 * каталога, в котором вы находитесь. Таким образом, он просматривает не только ваш текущий каталог, но и все каталоги, которые находятся в в вашем текущем каталоге).

3) После того, как вы установили PYTHONPATH на шаге выше, запустите ваш модуль из вашего текущего каталога (каталог toolkit). Теперь Python должен найти и загрузить указанные вами модули.

Надеюсь, это поможет. Я был очень разочарован этим сам.

22 голосов
/ 04 декабря 2008

Я решил свою проблему, и я напишу краткое изложение того, что было не так, и решение:

Файл должен называться точно __init__.py. Если расширение отличается, например, в моем случае .py.bin, то Python не может перемещаться по каталогам, а затем не может найти модули. Для редактирования файлов вам необходимо использовать редактор Linux, например vi или nano . Если вы используете редактор Windows, он напишет несколько скрытых символов.

Другая проблема, которая повлияла на это, заключалась в том, что у меня была установлена ​​другая версия Python от корня, поэтому, если кто-то работает с локальной установкой python, убедитесь, что установкой Python, на которой запущены программы, является локальный Python. Чтобы проверить это, просто выполните which python и посмотрите, находится ли исполняемый файл в вашем локальном каталоге. Если нет, измените путь, но убедитесь, что локальный каталог Python находится раньше, чем другой Python.

16 голосов
/ 18 сентября 2017

простое решение - установить модуль, используя python -m pip install <library-name> вместо pip install <library-name> Вы можете использовать sudo в случае ограничений администратора

16 голосов
/ 04 декабря 2008

Чтобы пометить каталог как пакет, вам нужен файл с именем __init__.py, это помогает?

12 голосов
/ 04 января 2017

Используя PyCharm (часть пакета JetBrains), вам нужно определить каталог скриптов как Source:
Right Click > Mark Directory as > Sources Root

6 голосов
/ 09 января 2014
  1. У вас должен быть файл __ init__.py в том же каталоге, где находится импортируемый файл.
  2. Вы не можете попытаться импортировать файл с таким же именем и файл из 2 папок, настроенных на PYTHONPATH.

например: / И т.д. / окружающая среда

PYTHONPATH = $ PYTHONPATH: / OPT / folder1: / OPT / folder2

/ Opt / folder1 / Foo

/ Opt / folder2 / Foo

И, если вы пытаетесь импортировать файл foo, python не будет знать, какой файл вам нужен.

из foo import ... >>> importerror: нет модуля с именем foo

6 голосов
/ 07 января 2009

Да. Вам нужен каталог, содержащий файл __init__.py, который является файлом, который инициализирует пакет. Здесь, посмотрите на это .

Файлы __init__.py необходимы для того, чтобы Python рассматривал каталоги как содержащие пакеты; это сделано для предотвращения непреднамеренного скрытия действительными модулями каталогов с общим именем, например, строки, которые встречаются позже в пути поиска модулей. В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнить код инициализации для пакета или установить переменную __all__, как описано ниже.

...