6

Ошибка Python "ImportError: Нет модуля с именем"

20

Описание проблемы:

У меня установлена версия 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. Также в папке toolkit есть файл __init__.py.bin, который указывает Python, что это пакет. В директории examples тоже есть файл __init__.py.bin.

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

5 ответ(ов)

3

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

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

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

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

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

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

    export PYTHONPATH=.

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

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

0

Для того чтобы импорт работал корректно, в каждой папке, через которую вы хотите пройти при импорте, должен находиться файл __init__.py. Таким образом, если в вашем каталоге (local directory)/site-packages/toolkit нет файла __init__.py, то импорт из этой директории не будет работать. Убедитесь, что файл присутствует, чтобы обеспечить возможность использования пакета.

0

На системах *nix убедитесь, что PYTHONPATH настроен правильно, особенно чтобы он имел следующий формат:

 .:/usr/local/lib/python

(Обратите внимание на .: в начале, чтобы поиск также выполнялся в текущем каталоге.)

Также PYTHONPATH может находиться в других местах в зависимости от версии:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 и т.д.
0

Чтобы определить директорию вашего скрипта как источник в PyCharm (часть набора инструментов JetBrains), выполните следующие шаги:

  1. Щелкните правой кнопкой мыши по нужной директории в панели проекта.
  2. В контекстном меню выберите опцию "Mark Directory as".
  3. Далее выберите "Sources Root".

Это позволит PyCharm правильно распознавать вашу директорию как корень исходных кодов, что упростит работу с импортами и зависимостями.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь