Ошибка Python "ImportError: Нет модуля с именем"
Описание проблемы:
У меня установлена версия 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 ответ(ов)
Судя по вашим комментариям к посту orip, мне кажется, что произошло следующее:
- Вы редактировали файл
__init__.py
в Windows. - Редактор в Windows добавил что-то непечатаемое, возможно, символ возврата каретки (конец строки в Windows — CR/LF, а в Unix — только LF), или, возможно, CTRL-Z (конец файла в Windows).
- Вы использовали WinSCP для копирования файла на вашу Unix-машину.
- WinSCP решил: "В этом файле есть что-то, что не является простым текстом; я добавлю расширение .bin, чтобы указать, что это бинарные данные."
- Отсутствие файла
__init__.py
(теперь называемого__init__.py.bin
) означает, что Python не распознает ваш инструмент как пакет. - Вы создаете новый файл
__init__.py
в нужном каталоге, и все начинает работать... верно?
Я столкнулся с чем-то очень похожим, когда делал это упражнение в LPTHW; я никак не мог заставить Python распознать файлы в каталоге, из которого я вызывал их. Но в конце концов мне это удалось. Вот что я сделал и что рекомендую:
(ПРИМЕЧАНИЕ: Исходя из вашего начального сообщения, я предполагаю, что вы используете систему на базе *NIX и работаете из командной строки, поэтому этот совет адаптирован под ваше окружение. Я использую Ubuntu, и именно это я сделал)
Перейдите в каталог, который находится выше каталога, где хранятся ваши файлы. В данном случае вы пытаетесь запустить файл
mountain.py
и вызвать модульtoolkit.interface.py
, которые находятся в разных каталогах. Таким образом, вам нужно перейти в каталог, который содержит пути к обоим этим файлам (или, другими словами, в ближайший каталог, общий для обоих файлов). В данном случае это каталогtoolkit
.Когда вы находитесь в каталоге
toolkit
, введите следующую команду в командной строке:export PYTHONPATH=.
Это устанавливает ваш PYTHONPATH в ".", что в принципе означает, что теперь ваш PYTHONPATH будет искать любые вызываемые файлы в каталоге, в котором вы сейчас находитесь (и, более важно, во всех подкаталогах текущего каталога). Таким образом, поиск будет происходить не только в вашем текущем каталоге, но и во всех каталогах, находящихся в вашем текущем каталоге.
После того как вы задали PYTHONPATH на предыдущем шаге, запустите ваш модуль из текущего каталога (каталог
toolkit
). Python теперь должен найти и загрузить указанные вами модули.
Для того чтобы импорт работал корректно, в каждой папке, через которую вы хотите пройти при импорте, должен находиться файл __init__.py
. Таким образом, если в вашем каталоге (local directory)/site-packages/toolkit
нет файла __init__.py
, то импорт из этой директории не будет работать. Убедитесь, что файл присутствует, чтобы обеспечить возможность использования пакета.
На системах *nix убедитесь, что PYTHONPATH настроен правильно, особенно чтобы он имел следующий формат:
.:/usr/local/lib/python
(Обратите внимание на .:
в начале, чтобы поиск также выполнялся в текущем каталоге.)
Также PYTHONPATH может находиться в других местах в зависимости от версии:
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 и т.д.
Чтобы определить директорию вашего скрипта как источник в PyCharm (часть набора инструментов JetBrains), выполните следующие шаги:
- Щелкните правой кнопкой мыши по нужной директории в панели проекта.
- В контекстном меню выберите опцию "Mark Directory as".
- Далее выберите "Sources Root".
Это позволит PyCharm правильно распознавать вашу директорию как корень исходных кодов, что упростит работу с импортами и зависимостями.
Импорт файлов из другой папки
Как решить проблему "ImportError: Невозможно импортировать имя X" или "AttributeError: ... (вероятно, из-за циклического импорта)"?
Как импортировать другие файлы Python?
Импорт модуля по относительному пути
Подключение файла из подпапки?