Ошибка Python “ImportError:Модуль не назван”
-
19-08-2019 - |
Вопрос
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
в папке toolkit указать Python, что это пакет.У меня также есть __init__.py.bin
в каталоге примеров.
Я не знаю, почему Python не может найти файл, когда он находится в sys.path
.Есть какие-нибудь идеи?Может ли это быть проблемой с разрешениями?Нужно ли мне какое-либо разрешение на выполнение?
Решение
Судя по вашим комментариям к сообщению orip, я предполагаю, что произошло следующее:
- Вы редактировали общий код тегов в Windows.
- Редактор Windows добавил что-то непечатаемое, например, возврат каретки (конец строки в Windows - CR / LF; в unix это только LF) или, возможно, CTRL-Z (конец строки в Windowsфайл).
- Вы использовали WinSCP для копирования файла в свой unix-сервер.
- WinSCP подумал: «Это что-то, кроме основного текста; я добавлю расширение .bin для обозначения двоичных данных».
- Отсутствующий код
__init__.py
(теперь называемый__init__.py
) означает, что python не понимает инструментарий как пакет. - Вы создаете генерирующий кодовый тег в соответствующем каталоге, и все работает ...?
Другие советы
Есть
родовое словоесть общий кодовый тег?
Чтобы импорт проходил по вашим каталогам, каждый каталог должен иметь файл с общим кодом кода.
В * nix также убедитесь, что PYTHONPATH настроен правильно, особенно если он имеет следующий формат:
родовое слово(Обратите внимание на код сгенерированного кода в начале, чтобы он мог выполнять поиск и в текущем каталоге.)
Он также может быть в других местах, в зависимости от версии:
родовое словоЯ столкнулся с чем-то очень похожим, когда делал это упражнение в LPTHW; Я никогда не мог заставить Python распознавать, что у меня есть файлы в каталоге, из которого я звонил. Но в конце концов мне удалось заставить его работать. Что я сделал и рекомендую, так это попробовать следующее:
(ПРИМЕЧАНИЕ: из вашего первоначального сообщения я предполагаю, что вы используете машину на базе * NIX и запускаете что-то из командной строки, поэтому этот совет адаптирован для этого. Поскольку я запускаю Ubuntu, это то, что я сделал )
1) Измените каталог (cd) на каталог выше каталога, в котором находятся ваши файлы. В этом случае вы пытаетесь запустить файл mountain.py
и пытаетесь вызвать модуль toolkit.interface.py
, который находится в отдельных каталогах. В этом случае вы должны перейти в каталог, содержащий пути к обоим этим файлам (или, другими словами, в ближайший каталог, в котором находятся общие пути обоих этих файлов). В данном случае это каталог toolkit
.
2) Когда вы находитесь в каталоге tookit
, введите следующую строку кода в командной строке:
export PYTHONPATH=.
Это устанавливает для вашего PYTHONPATH значение ".", что в основном означает, что ваш PYTHONPATH теперь будет искать все вызываемые файлы в каталоге, в котором вы сейчас находитесь (и, что более важно, в подкаталогах branch каталога, в котором вы находитесь. Таким образом, он просматривает не только ваш текущий каталог, но и все каталоги, которые в вашем текущем каталоге).
3) После того, как вы установили свой PYTHONPATH на предыдущем шаге, запустите свой модуль из текущего каталога (каталог toolkit
). Python должен найти и загрузить указанные вами модули.
Надеюсь, это поможет. Я сам был очень расстроен этим.
Я решил свою собственную проблему, и я напишу краткое изложение того, что было неправильным, и решения:
Файл должен быть вызван точно __init__.py
.Если расширение отличается, например, в моем случае .py.bin
тогда Python не сможет перемещаться по каталогам, а затем не сможет найти модули.Для редактирования файлов вам необходимо использовать редактор Linux, такой как vi или нано.Если вы используете редактор Windows, это приведет к написанию некоторых скрытых символов.
Другая проблема, которая повлияла на это, заключалась в том, что у меня была установлена другая версия Python от root, поэтому, если кто-то работает с локальной установкой python, убедитесь, что установка Python, на которой выполняются программы, является локальной Python.Чтобы проверить это, просто выполните which python
, и посмотрите, является ли исполняемый файл тем, который находится в вашем локальном каталоге.Если нет, измените путь, но убедитесь, что локальный каталог Python находится раньше, чем другой Python.
Чтобы пометить каталог как пакет, вам понадобится файл с именем __init__.py
, помогает ли это?
простое решение - установить модуль с использованием python -m pip install <library-name>
вместо pip install <library-name>
вы можете использовать sudo в случае ограничений администратора
Используя PyCharm
(часть пакета JetBrains), вам необходимо определить каталог сценария как Source:
Right Click > Mark Directory as > Sources Root
Ага.Вам нужен каталог, чтобы содержать файл __init__.py
, который является файлом, который инициализирует пакет.Взгляните на это .
Файлы __init__.py необходимы, чтобы Python обрабатывал каталоги как содержащие пакеты;это сделано для того, чтобы каталоги с общим именем, таким как строка, не могли непреднамеренно скрыть допустимые модули, которые появляются позже на пути поиска модулей.В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнять код инициализации для пакета или устанавливать переменную __all__, как описано ниже.
- У вас должен быть файл __ init__.py в том же каталоге, где это файл, который вы импортируете.
- Нельзя пытаться импортировать файл с тем же именем, который является файлом из двух папок, настроенных на PYTHONPATH.
например: / etc / environment
PYTHONPATH= $ PYTHONPATH: / opt / folder1: / opt / folder2
/ opt / folder1 / foo
/ opt / folder2 / foo
И если вы пытаетесь импортировать файл foo, python не узнает, какой из них вам нужен.
from foo import ... >>> importerror: нет модуля с именем foo
Мои два цента:
Плевать:
родовое слово Это меня до чертиков смутило - просматривал сообщения и сообщения, предлагающие уродливые взломы syspath (как вы видите, там был весь мой __init__.py
). Что ж, получается, что game / Oblivion.py и game / Oblivion сбивали с толку питон
которые выплевывают довольно бесполезную фразу «Нет модуля с именем RecordGroups». Мне было бы интересно найти обходной путь и / или ссылки, документирующие это (одноименное) поведение -> ИЗМЕНИТЬ (2017.01.24) - посмотрите Что делать, если у меня есть модуль и пакет с одинаковым именем? Интересно, что обычно пакеты имеют приоритет, но, очевидно, наша программа запуска нарушает это.
РЕДАКТИРОВАТЬ (2015.01.17): я не упоминал, что мы используем настраиваемая программа запуска проанализирована здесь .
Linux: импортированные модули находятся в /usr/local/lib/python2.7/dist-packages
Если вы используете модуль, скомпилированный на C, не забудьте изменить chmod для файла .so после sudo setup.py install
.
Вы читаете этот ответ, в котором говорится, что ваш __init__.py
находится в нужном месте, вы установили все зависимости, и вы все еще получаете код ImportError
.
Я столкнулся с аналогичной проблемой, за исключением того, что моя программа работала нормально при использовании PyCharm, но указанная выше ошибка, когда я запускал ее с терминала.Покопавшись дальше, я обнаружил, что в PYTHONPATH
нет записи для каталога проекта.Итак, я установил код PYTHONPATH
для оператора импорта, работающего в PyCharm, но не с терминала :
Есть другой способ сделать это, используя код сгенерированного кода:
родовое словоВы можете использовать вставку / добавление в зависимости от порядка, в котором вы хотите, чтобы ваш проект просматривался.
В моем случае проблема заключалась в том, что я использовал ссылку на debug python
и boost::Python
, для чего требуется, чтобы расширение было FooLib_d.pyd
, а не только FooLib.pyd
;переименование файла или обновление свойств кода кода кода исправили ошибку.
Моя проблема заключалась в том, что я добавил каталог с файлом __init__.py
в PYTHONPATH, хотя на самом деле мне нужно было добавить его родительский каталог.
Если вы попробовали все методы, указанные выше, но не смогли, возможно, ваш модуль имеет то же имя , что и встроенный модуль.Или модуль с тем же именем , существующий в папке, которая имеет более высокий приоритет в кодовом коде вашего модуля, чем у вашего модуля.
Для отладки назовите ваши жалобы на кодовый кодовый код sys.path
.Переход к from foo.bar import baz
, который покажет путь к ImportError: No module named bar
.Вы этого ожидаете?
Если нет, либо переименуйте import foo; print foo
, либо используйте абсолютный импорт .
В моем случае, поскольку я использую PyCharm, и PyCharm создают «venv» для каждого проекта в папке проекта, но это всего лишь мини-env для python.Хотя вы установили нужные библиотеки в Python, но в вашем пользовательском проекте venv они недоступны.Это настоящая причина ImportError: в PyCharm не было модуля с именем xxxxxx. Чтобы решить эту проблему, необходимо добавить библиотеки в настраиваемую среду проекта, выполнив следующие действия:
- В PyCharm из меню "Файл" -> "Настройки".
- В диалоговом окне "Настройки" выберите Project: XXXProject-> Project Interpreter.
- Нажмите кнопку «Добавить», откроется диалоговое окно «Доступные пакеты».
- Найдите свою библиотеку, нажмите "Установить пакет".
- Затем все необходимые вам пакеты будут установлены в папку вашего проекта 'venv'.
Наслаждайтесь.
Исправил мою проблему, написав код print (sys.path)
и обнаружив, что python использует устаревшие пакеты, несмотря на чистую установку.Удаление этих созданных python автоматически использует правильные пакеты.
Всем, у кого еще есть эта проблема.Я считаю, что Pycharm путают с импортом.Для меня, когда я пишу «from namespace import something», предыдущая строка подчеркивается красным цветом, сигнализируя об ошибке, но работает.Однако "из .namespace import something" не подчеркивается, но и не работает.
Попробовать
родовое слово После того, как я столкнулся с той же проблемой, я обнаружил, что моим решением было удалить все файлы pyc
из моего проекта, похоже, что эти кешированные файлы каким-то образом вызывали эту ошибку.
Самый простой способ, который я нашел для этого, заключался в том, чтобы перейти к папке моего проекта в проводнике Windows и выполнить поиск кода *.pyc
, затем выбрать все ( Ctrl + A ) и удалить их( Ctrl + X ).
Возможно, я мог бы решить свои проблемы, просто удалив конкретный файл pyc
, но я никогда не пробовал этого
Я столкнулся с той же проблемой: Import error
.К тому же библиотека установлена на 100% правильно.Причина проблемы заключалась в том, что на моем компьютере была установлена 3 версия python (пакет anaconda)).Поэтому библиотека была установлена не в нужное место.После этого я просто перешел на правильную версию python в моей IDE PyCharm.
У меня была такая же ошибка.Это было вызвано тем, что кто-то создал папку в той же папке, что и мой сценарий, имя которой противоречило имени модуля, который я импортировал из другого места.Вместо того, чтобы импортировать внешний модуль, он заглянул внутрь этой папки, которая явно не содержала ожидаемых модулей.
У меня была такая же проблема (Python 2.7 Linux), я нашел решение и хочу им поделиться.В моем случае у меня была структура ниже:
родовое словоВ 'main.py' я безуспешно пробовал все комбинации ниже:
родовое словоРешение оказалось намного проще, чем я думал.Папку «Буклет» переименовал в «Буклет» и все.Теперь Python может импортировать класс Question обычно, используя в main.py код:
родовое словоИз этого я могу сделать вывод, что имена пакетов (папок), такие как «буклет», должны начинаться с нижнего регистра, иначе Python путает их с именами классов и именами файлов.
По-видимому, это была не ваша проблема, но ответ Джона Фухи очень хорош, и в этой ветке есть почти все, что может вызвать эту проблему.Итак, это еще одна вещь, и я надеюсь, что, возможно, это поможет другим.
В моем случае я указывал путь к папке package.egg, а не к фактическому пакету внизу.Я скопировал пакет на верхний уровень, и он сработал.
У меня сработало:
Создан файл __init__.py
внутри родительской папки (в вашем случае внутри папки site-packages
).И импортировал вот так:
Надеюсь, это будет полезно и для вас!