Ошибка Python «ImportError: модуль не указан»

452

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. Любые идеи? Это может быть проблема с разрешениями? Мне нужно разрешение на исполнение?

Эдуардо
источник
3
Убедитесь, что у вас есть разрешение на чтение этого файла из python. См .: stackoverflow.com/a/20999950/1657225
cSn
1
Обязательно пометьте свой каталог как «Root Resources», чтобы PyCharm знал, что это пакет.
эммфд
Проблема в моем случае заключалась в том, что там было разрешение, чтобы вновь установленных модулей не было 755. Это потому , что umaskна машине был 0027из - за которой othersне было readразрешения , вызывающий модуль не может быть считан. Добавление readразрешения исправило мою проблему. Стоит проверить разрешение целевого каталога после установки.
ана
Попробуйте
Rawan-25
возможно имя локального каталога interface (был конфликт).
Беньямин Джафари

Ответы:

267

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

  1. Вы редактировали __init__.py на окнах.
  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в соответствующем каталоге и все работает ...?
Джон Фухи
источник
50
Кроме того, python -c 'import sys; print sys.path 'помогает - иногда пользователь помещает файлы в путь, который не сканируется.
mikebabcock
1
Я использую то же самое, кроме WinSCP не добавляется .bin.
пользователь
9
если у меня будет пустой "__init__.py", произойдет ли то же самое?
диетическое питание
2
OMG, Ты правишь! Это моя история: 1. Вы отредактировали init .py на windows 2. Он добавил TAB вместо пробелов 3. Вы много гуглили, пока не нашли этот пост! ;)
GBrian
1
Для меня проблема заключалась в том, что я использовал, python driver.pyкогда я должен был использовать, python3 driver.pyтак как я установил с pip3.
Эрик Винер
72

Имеет ли

(local directory)/site-packages/toolkit

иметь __init__.py ?

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

igorgue
источник
1
Хорошая точка зрения! Примечание: Начиная с Python 3.3, любой каталог в sys.path с именем, совпадающим с именем пакета, будет распознан.
PatrickT
1
Разве это не необходимо только для ссылок относительного пути? почему должен каждый каталог есть это?
Sonic Soul
56

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

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

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

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

export PYTHONPATH=.

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

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

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

Specterace
источник
2
Или на винде set PYTHONPATH=..
cjbarth
Это сработало для меня. Кроме того, ПОЛНОСТЬЮ упростил мои разочарования PYTHONPATH, так как мне пришлось бы обновлять его до абсолютного пути каждый раз, когда я переключаю машины. Спасибо Спасибо спасибо.
the_e
41

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

 .:/usr/local/lib/python

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

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

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Renaud
источник
6
Он также может быть .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7и т.д. , в зависимости от версии
Никита Волков
Для меня модуль находится в /usr/local/lib/python3.4/dist-packages, но когда я набираю python3 в терминале (ubuntu) и пытаюсь импортировать его, он не позволяет мне, говоря, что он не существует «ImportError: модуль x не существует»
user65165
Добавление #!/usr/bin/pythonв конце файла тоже должно работать, верно?
Nearoo
1
@ Не думаю, что это сработает. Плюс обычно этот шебанг добавляется вверху файла.
Рено
2
В MacOSX исправили это, добавив PYTHONPATH = / usr / local / lib / python2.7 / site-packages в сценарии запуска.
Йохан Сноугуз
23

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

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

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

Эдуардо
источник
Проблема, с которой я столкнулся, состояла в том, что модуль был (пере) установлен pip только с пользователем root, чтобы получить к нему доступ, поэтому пользователь, запустивший программу, его не увидел.
Янис Элмерис
@ JānisElmeris, не могли бы вы подробнее остановиться на вышеприведенном комментарии, я думаю, что я также сталкиваюсь с подобной ошибкой. Мои __init__.pyфайлы помещены в соответствующую директорию, но я вручную установил пакет, используя setup.py. Как установка нового пакета помешала бы импорту.
Кришна Оза
@darth_coder, извините, это было шесть лет назад, и я не помню случая. Кроме того, я имею дело с Python очень мало, совсем недавно. Из того, что я написал, я могу просто подумать, что я установил пакет как root, который изменил разрешения, чтобы другие пользователи не имели доступа, который у них был раньше.
Янис Элмерис
19

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

Бадр Беллай
источник
2
Чего python -mдостичь перед pip install?
sporc
1
@sporc - когда вы используете флаг командной строки -m, Python импортирует модуль или пакет для вас, а затем запускает его как скрипт. Если вы не используете флаг -m, файл, который вы назвали, запускается как скрипт.
Тони Чикароне
Не уверен, что этот ответ пытается сказать, python -m pip...работает, но pip...не сделал: они фактически одно и то же, предполагая, что они на самом деле находятся в одном pythonкаталоге. Возможно, наблюдаемая ситуация состояла в том, что автономная pipпрограмма не была доступна в некоторых старых версиях Python (но теперь она в последних 2.7 и 3.x). В этом случае он pythonнаходился в локальном virtualenv и pipне был, поэтому python -m pip installустановил бы в локальном virtualenv, тогда как pipпопытался бы установить в системном python (и потерпел неудачу без sudo). В любом случае это не имеет смысла.
Майкл
17

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

orip
источник
У меня уже есть файл с именем init .py.bin. Если я изменяю имя на init .py, то получаю эту ошибку: /__init__.py ", строка 1" утилиты "," демо "] ^ SyntaxError: неверный синтаксис
Эдуардо
Что в init .py? Опубликуйте это как часть вашего вопроса, пожалуйста.
S.Lott
Там ничего нет, пусто, Это было с пакетом, который я загружаю, мне нужно что-то записать в файл ?.
Эдуардо
@ S.Lott: вам не нужно ничего вставлять в init .py правильно?
igorgue
1
@Eduardo. Ваш init .py получает ошибку. И вы говорите, что это пусто. Это трудно примирить. И его нельзя назвать init .py.bin - Python проигнорирует этот файл. Как правило, в нем ничего не может быть.
S.Lott
16

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

MonoThreaded
источник
12

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

Я столкнулся с аналогичной проблемой, за исключением того, что моя программа работала нормально при запуске с использованием PyCharm, но с вышеприведенной ошибкой, когда я запускал ее из терминала. Покопавшись дальше, я обнаружил, что PYTHONPATHне было записи для каталога проекта. Итак, я устанавливаю для PYTHONPATHкаждого оператора импорта работает на 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>')

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

AVP
источник
12

Для меня это было что-то действительно глупое. Я установил библиотеку, используя, pip3 installно python program.pyв отличие от python3 program.py.

кэв
источник
1
Вот Это Да ! Это сработало и для меня.
JavaDeveloper
1
Ты спас мой день.
Аймен
7

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

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

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

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

PYTHONPATH = $ PYTHONPATH: / OPT / folder1: / OPT / folder2

/ Опт / folder1 / Foo

/ Опт / folder2 / Foo

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

из foo import ... >>> importerror: нет модуля с именем foo

Ясмини Гомес
источник
5

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

введите описание изображения здесь

Кос:

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

Это чертовски смутило меня - просматривал посты и посты, в которых предлагались уродливые взломы сиспатов (как вы видите, __init__.pyвсе мои были там). Хорошо получается, что game / oblivion.py и game / oblivion приводили в замешательство питона, который выплевывал довольно бесполезный «Нет модуля с именем RecordGroups». Я был бы заинтересован в обходном пути и / или ссылках, документирующих это (одноименное) поведение -> РЕДАКТИРОВАТЬ (2017.01.24) - посмотрите, что если у меня есть модуль и пакет с тем же именем? Интересно нормально пакеты имеют приоритет, но, видимо, наша программа запуска нарушает это.

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

Mr_and_Mrs_D
источник
больше похоже на путь выключен. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Возможно, вы захотите исправить это, добавив ваш код на python:game.oblivion.patchers.RecordGroups
Дуайт Спенсер
@DwightSpencer: я уверен, что я импортировал «RecordGroups», game.oblivion.__init__.pyно, возможно, придется проверить это
Mr_and_Mrs_D
4

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
KrisWebDev
источник
3

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

Петр Карасев
источник
3

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

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

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

liushuaikobe
источник
1
Для меня это уступает ImportError: No module named foo.
Алекс
3

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

Богатые
источник
3

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

Пытаться

try:
    from namespace import something 
except NameError:
    from .namespace import something
AKJ
источник
1
Первый - синтаксис Python 2, второй - Python 3.
Таня Бранаган
2

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

лимон
источник
2

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

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

Диалог настроек

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

Yuanhui
источник
0

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

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

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

Sayse
источник
0

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

Rocketq
источник
0

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

Тойво Савен
источник
0

У меня была такая же проблема (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 путает его с именами классов и именами файлов.

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

ioaniatr
источник
0

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

Fakrudeen
источник
0

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

from site-packages.toolkit.interface import interface

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

Шерзод
источник
0

В linux server попробуй dos2unix script_name

(удалить все (если есть) pycфайлы командой find . -name '*.pyc' -delete)

и снова запустите в случае, если вы работали над сценарием на Windows

Poli
источник
0

В моем случае я использовал sys.path.insert()для импорта локальный модуль и получал module not foundиз другой библиотеки. Я должен был поставить sys.path.insert()ниже импорта, который сообщил module not found. Я полагаю, что лучшая практика заключается в том, чтобы поставить sys.path.insert()в нижней части вашего импорта.

Михал Завадзки
источник