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

38 ответов

Решение

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

  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 в соответствующем каталоге и все работает...?

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

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

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

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

export PYTHONPATH=.

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

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

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

Есть ли

(local directory)/site-packages/toolkit

иметь __init__.py?

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

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

 .:/usr/local/lib/python

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

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

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

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

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

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>')

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

НТН.

Источник

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

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

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

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

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

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

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

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

Пытаться

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

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

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

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

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

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

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

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

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

/ Опт /folder1/ Foo

/ Опт /folder2/ Foo

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

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

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

Кос:

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 приводили в замешательство питона, который выплевывал довольно бесполезный "Нет модуля с именем RecordGroups". Я был бы заинтересован в обходном пути и / или ссылках, документирующих это (одноименное) поведение -> РЕДАКТИРОВАТЬ (2017.01.24) - посмотрите, что если у меня есть модуль и пакет с тем же именем? Интересно, что обычно пакеты имеют приоритет, но, видимо, наша программа запуска нарушает это.

РЕДАКТИРОВАТЬ (2015.01.17): я не упомянул, что мы используем пользовательский модуль запуска, рассмотренный здесь.

Мне помог запуск файла как модуля.

Вместо

      python myapp/app.py

с использованием

      python -m myapp.app

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

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

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

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

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

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

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

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

Если вы используете сценарий / утилиту установки (например, setuptools) для развертывания пакета, не забудьте добавить соответствующие файлы / модули в программу установки.


Если поддерживается, используйте find_packages()или аналогично автоматическому добавлению новых пакетов в сценарий установки. Это абсолютно избавит вас от головной боли, особенно если вы отложите проект на какое-то время, а потом добавите что-нибудь.

import setuptools

setuptools.setup(
    name="example-pkg",
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

(Пример взят из документации setuptools)

Если у вас сжатые сроки и ничего не помогает:

      import sys
import os
wd = '/path/to/current/script/'
sys.path.append(wd)
os.chdir(wd)
print(os.getcwd())
print(sys.path)

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

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

На сервере Linux попробуйте dos2unix script_name

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

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

другая причина делает эту проблему

      #!/bin/python
from bs4 import BeautifulSoup
  • если ваш по умолчаниюpythonявляетсяpyyhon2
      $ file $(which python)
/sbin/python: symbolic link to python2
  • нуждатьсяpython3, для этого случая(bs4)
  • вы не можете выполнить этот модуль сpython2так:
      $ python file.py
# or
$ file.py
# or
$ file.py # if locate in $PATH
  • Как это исправитьerror,
      # should be to make python3 as default by symlink
$ rm $(which python) && ln -s $(which python3) /usr/bin/python
# or use alias
alias python='/usr/bin.../python3'

или изменитьshebangвfile.pyк

      #!/usr/bin/...python3

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

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

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

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

Другие вопросы по тегам