Ошибка 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. Кроме того, у меня есть файл __init__.py.bin в папке инструментария, чтобы указать Python, что это пакет. У меня также есть __init__.py.bin в каталоге примеров.

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

Ответ 1

Основываясь на ваших комментариях к сообщению orip, я предполагаю, что это произошло:

  • Вы отредактировали __init__.py в окнах.
  • Редактор окон добавил что-то непечатное, возможно, возврат каретки (конец строки в Windows - CR/LF, в unix - только LF) или, возможно, CTRL-Z (конец окна - файл).
  • Вы использовали WinSCP для копирования файла в ваш unix-блок.
  • WinSCP подумал: "У этого есть не основной текст, я добавлю расширение .bin, чтобы указать двоичные данные".
  • Отсутствующий __init__.py (теперь называемый __init__.py.bin) означает, что python не понимает инструментарий как пакет.
  • Вы создаете __init__.py в соответствующем каталоге, и все работает...?

Ответ 2

ли

(local directory)/site-packages/toolkit

имеют a __init__.py?

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

Ответ 3

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

 .:/usr/local/lib/python

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

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

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

Ответ 4

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

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

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

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

export PYTHONPATH=.

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

Ага. Вам необходимо, чтобы в каталоге содержался файл __init__.py, который является файлом, который инициализирует пакет. Вот, посмотрите на это.

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

Ответ 10

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

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

PYTHONPATH = $PYTHONPATH:/OPT/folder1:/опт/folder2

/Opt/folder1/Foo

/Opt/folder2/Foo

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

из импорта foo... → > importerror: нет модуля с именем foo

Ответ 11

Мои два цента:

enter image description here

Коса:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Это смутило меня от меня - прошли через сообщения и сообщения, предлагающие уродливые взломы syspath (как вы видите, мой __init__.py был там). Ну получается, что game/oblivion.py и game/oblivion путают python которые выплескивают довольно бесполезный "Нет модуля с именем RecordGroups". Мне было бы интересно обходное решение и/или ссылки, документирующие это поведение (такое же имя) → EDIT (2017.01.24) - посмотрите What If У меня есть модуль и пакет с одним и тем же именем? Интересно, что обычно пакеты имеют приоритет, но, видимо, наша пусковая установка нарушает это.

EDIT (2015.01.17): Я не упоминал, что мы использовали пользовательский запуск, расчлененный здесь.

Ответ 12

Вы читаете, что в этом ответе говорится, что ваш __init__.py находится в нужном месте, вы установили все зависимости и по-прежнему получаете ImportError.

Я столкнулся с аналогичной проблемой, за исключением того, что моя программа работала нормально при запуске с использованием PyCharm, но с вышеприведенной ошибкой, когда я запускал ее из терминала. Покопавшись дальше, я обнаружил, что у PYTHONPATH нет записи для каталога проекта. Итак, я установил PYTHONPATH для оператора Import, работает на PyCharm, но не с терминала:

export PYTHONPATH=$PYTHONPATH:'pwd'  (OR your project root directory)

Есть еще один способ сделать это, используя sys.path как:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Вы можете использовать вставку/добавление в зависимости от порядка поиска проекта.

Ответ 13

Linux: импортированные модули находятся в каталоге /usr/local/lib/python 2.7/dist-packages

Если вы используете модуль, скомпилированный на C, не забудьте chmod.so файл после sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

Ответ 14

В моем случае проблема заключалась в том, что я связывался с debug python и boost::Python, который требует, чтобы расширение было FooLib_d.pyd, а не только FooLib.pyd; переименование файла или обновление свойств CMakeLists.txt исправили ошибку.

Ответ 15

Моя проблема заключалась в том, что я добавил каталог с файлом __init__.py в PYTHONPATH, когда на самом деле мне нужно было добавить его родительский каталог.

Ответ 16

Если вы пробовали все приведенные выше методы, но не смогли, возможно, ваш модуль имеет одно и то же имя как встроенный модуль. Или модуль с с тем же именем, существующим в папке с высоким приоритетом в sys.path, чем ваш модуль.

Чтобы отладить, скажите свои жалобы from foo.bar import baz ImportError: No module named bar. Переход на import foo; print foo, который покажет путь foo. Это то, что вы ожидаете?

Если нет, переименуйте foo или используйте абсолютный импорт.

Ответ 17

В моем случае, потому что я использую PyCharm и PyCharm, создаю 'venv' для каждого проекта в папке проекта, но это всего лишь мини-env python. Хотя вы установили необходимые библиотеки в Python, но в вашем собственном проекте 'venv' он недоступен. Это реальная причина "ImportError: в PyCharm не было модуля с именем xxxxxx". Чтобы решить эту проблему, вы должны добавить библиотеки в свой проект env, выполнив следующие действия:

  • В PyCharm из меню "Файл" → "Настройки"
  • В диалоге настроек, Project: XXXProject-> Project Interpreter
  • Нажмите кнопку "Добавить", появится диалоговое окно "Доступные пакеты".
  • Поиск в вашей библиотеке, нажмите "Установить пакет"
  • Затем все необходимые вам пакеты будут установлены в вашей папке проекта 'venv'.

Settings dialog

Наслаждаться.

Ответ 18

Для меня это было что-то действительно глупое. Я установил библиотеку, используя pip3 install, но выполнял мою программу как python program.py, а не python3 program.py. Иногда так и бывает ¯\_(ツ)_/¯.

Ответ 19

Исправлена ​​проблема с записью print (sys.path) и выяснялось, что на python использовались устаревшие пакеты, несмотря на чистую установку. Удаление этих python автоматически использует правильные пакеты.

Ответ 20

Всем тем, у кого еще есть эта проблема. Я считаю, что Pycharm путают с импортом. Для меня, когда я пишу "из пространства имен импортировать что-то", предыдущая строка подчеркивается красным, сигнализируя, что есть ошибка, но она работает. Однако "из .namespace import что-то" не подчеркивается, но также не работает.

Попробуйте

try:
    from namespace import something 
except NameError:
    from .namespace import something

Ответ 21

После того, как я испытал одну и ту же проблему, я решил, что мое решение состоит в том, чтобы удалить все файлы pyc из моего проекта, похоже, что эти кэшированные файлы каким-то образом вызывают эту ошибку.

Самый простой способ, которым я нашел это, - перейти к папке моего проекта в проводнике Windows и найти *.pyc, затем выбрать все (Ctrl + A) и удалить их (Ctrl + X).

Возможно, я смог решить свои проблемы, просто удалив конкретный файл pyc, но я никогда не пробовал этот

Ответ 22

У меня возникла та же проблема: Import error. Кроме того, библиотека была установлена ​​на 100% правильно. Источником проблемы было то, что на моем компьютере была установлена ​​версия python (пакет anaconda) 3). Вот почему библиотека была установлена ​​не в нужном месте. После этого я просто перешел к правильной версии python в моем IDE PyCharm.

Ответ 23

У меня была такая же ошибка. Это было вызвано тем, что кто-то создал папку в той же папке, что и мой script, имя которой противоречило модулю, который я импортировал из другого места. Вместо импорта внешнего модуля он просматривал эту папку, которая явно не содержала ожидаемых модулей.

Ответ 24

У меня была та же проблема (Python 2.7 Linux), я нашел решение и хотел бы поделиться им. В моем случае у меня была структура ниже:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

В 'main.py' я безуспешно пробовал все комбинации ниже:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

Решение было намного проще, чем я думал. Я переименовал папку "Буклет" в "Брошюра" и все. Теперь Python может импортировать класс Question, как обычно, используя код main.py:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Из этого я могу сделать вывод, что имена пакетов (папки), такие как "буклет", должны начинаться с нижнего регистра, иначе Python путает его с именами классов и именами файлов.

Очевидно, это была не ваша проблема, но ответ Джона Фухи очень хороший, и в этой ветке есть почти все, что может вызвать эту проблему. Итак, это еще одна вещь, и я надеюсь, что, возможно, это могло бы помочь другим.

Ответ 25

В моем случае я указывал путь к папке package.egg, а не фактический пакет внизу. Я скопировал пакет на верхний уровень, и он работал.

Ответ 26

Это сработало для меня: создал файл __init__.py внутри родительской папки (в вашем случае, внутри папки site-packages). И импортируется так:

from site-packages.toolkit.interface import interface

Надеюсь, это будет полезно и вам!

Ответ 27

Добавьте файл __init__.py в каталог, в котором находится ваш модуль.

Файлы с именем __init__.py используются для маркировки каталогов на диске как каталогов пакетов Python.