Вопрос

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, я предполагаю, что произошло следующее:

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

Другие советы

Есть

родовое слово

есть общий кодовый тег?

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

В * 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__, как описано ниже.

  1. У вас должен быть файл __ init__.py в том же каталоге, где это файл, который вы импортируете.
  2. Нельзя пытаться импортировать файл с тем же именем, который является файлом из двух папок, настроенных на 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).И импортировал вот так:

родовое слово

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top