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



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

2298   21  

21 ответов:

на основе ваших комментариев к посту orip, я думаю, что это случилось:

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

тут

(local directory)/site-packages/toolkit

есть __init__.py?

сделать импорт прогулка через ваши каталоги каждый каталог должен иметь .

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

 .:/usr/local/lib/python

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

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

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

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

(примечание: из вашего первоначального сообщения я предполагаю, что вы используете машину на основе *NIX и запускаете вещи из командной строки, поэтому этот совет адаптирован к этому. Поскольку я запускаю Ubuntu, это то, что я сделал)

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

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

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

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

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

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

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

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

например: / etc / environment

PYTHONPATH=$PYTHONPATH:/opt / folder1:/opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

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

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

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

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

Linux: импортированные модули находятся в /usr / local/lib/python2. 7/dist-packages

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

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

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

мои две копейки:

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 а игра / забвение сбивала с толку питона который выплюнул довольно бесполезный "нет модуля с именем RecordGroups". Мне было бы интересно найти обходной путь и / или ссылки, документирующие это (то же имя) поведение -> EDIT (2017.01.24) - посмотрите в что делать, если у меня есть модуль и пакет с тем же именем? интересно нормально пакетов имеет приоритет, но, по-видимому, наша пусковая установка нарушает это.

EDIT (2015.01.17): я не упоминал, что мы используем custom launcher рассеченные здесь.

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

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

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

если нет, либо переименовать foo или использовать Абсолют импорт.

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

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

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

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

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

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

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

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

In '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 можно импортировать как правило, вопрос класса с помощью в main.py' код:

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

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

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

в моем случае я включал путь к пакету.яичная папка, а не фактический пакет под ней. Я скопировал пакет на верхний уровень, и это сработало.

Comments

    Ничего не найдено.