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. Есть идеи? Может это проблема с разрешениями? Мне нужно разрешение на выполнение?
Обязательно пометьте свой каталог как «Resources Root», чтобы PyCharm узнал, что это пакет.
Проблема в моем случае заключалась в том, что было разрешение на новые установленные модули, а не 755. Это произошло потому, что umask на машине был 0027, из-за чего у others не было разрешения read, из-за чего модуль не читался. Добавление разрешения read устранило мою проблему. После установки стоит проверить разрешение целевого каталога.
Попробуйте взорвать url: stackoverflow.com/questions/47887614/…
возможно, имя локального каталога - interface (возник конфликт).
проверьте такие вещи, как: используется ли python2 вместо 3? У ваших файлов настроено правильное окончание строки? Правильно ли объявлены пакеты?






Чтобы пометить каталог как пакет, вам нужен файл с именем __init__.py, это поможет?
У меня уже есть файл с именем в этом.py.bin. Если я изменю имя на в этом.py, я получаю эту ошибку: /__init__.py ", строка 1" утилиты "," демонстрация "] ^ SyntaxError: неверный синтаксис
Что в в этом.py? Опубликуйте это как часть вашего вопроса, пожалуйста.
Ничего нет, он пустой, это было с пакетом, который я скачиваю, нужно ли что-то писать в файле ?.
@ S.Lott: вам не нужно ничего класть в свой в этом.py, верно?
@ Эдуардо. Ваш в этом.py получает ошибку. А вы говорите, что он пустой. С этим трудно примириться. И его нельзя назвать в этом.py.bin - Python проигнорирует этот файл. Обычно в нем ничего не может быть.
Вы были правы, Лотт, я отредактировал файл с помощью редактора Windows, и он написал несколько скрытых символов, теперь я создал новые файлы с помощью vi.
@Eduardo: Вы можете захотеть получить Блокнот программиста или Komodo Edit или что-то, что редактирует чистый текст без скрытых специальных символов. Они могут быть проще в использовании, чем vi.
Спасибо за совет. Я обычно использую nano для редакции. Причина, по которой я использовал редактор Windows, заключается в том, что я работаю в кластере и использую WinSCP для перемещения файлов, а иногда я использую этот редактор для файлов изменений.
Делает
(local directory)/site-packages/toolkit
есть __init__.py?
Чтобы выполнить импорт ходить через ваши каталоги, в каждом каталоге должен быть файл __init__.py.
Хорошая точка зрения! Примечание. Начиная с Python 3.3, любой каталог в sys.path с именем, совпадающим с именем пакета, будет распознан.
разве это не нужно только для ссылок на относительный путь? почему должен есть в каждом каталоге?
Основываясь на ваших комментариях к сообщению orip, я предполагаю, что произошло следующее:
__init__.py в windows.__init__.py (теперь называемый __init__.py.bin) означает, что python не понимает инструментарий как пакет.__init__.py в соответствующем каталоге и все работает ...?Кроме того, python -c 'import sys; print sys.path 'помогает - иногда пользователь помещал файлы по пути, который не проверялся.
Я использую то же самое, за исключением того, что WinSCP не добавлял .bin.
если у меня пустой "__init__.py", произойдет ли то же самое?
OMG, вы правите! Это моя история: 1. Вы редактировали в этом.py в Windows 2. Он добавил TAB вместо пробелов 3. Вы много гуглите, пока не найдете этот пост! ;)
Для меня проблема заключалась в том, что я использовал python driver.py, тогда как мне следовало использовать python3 driver.py с тех пор, как я установил с pip3.
Как отметил @EricWiener, использование python 2 также может вызвать эту проблему. Он может использовать #! / Usr / bin / env python для обнаружения среды python и отображать python2 вместо python3, что вызывает эту ошибку в некоторых пакетах.
Что внутри в этом.py?
чтобы добавить комментарий @mikebabcock, из пути, в моем случае, есть прецедентный путь, содержащий папку, которая маскирует фактическую папку, которую я собираюсь использовать.
Я решил свою проблему и напишу краткое изложение того, что было не так, и решение:
Файл нужно называть именно __init__.py. Если расширение отличается, например, в моем случае .py.bin, тогда Python не может перемещаться по каталогам, а затем не может найти модули. Для редактирования файлов вам необходимо использовать редактор Linux, например vi или нано. Если вы используете редактор Windows, это напишет некоторые скрытые символы.
Другая проблема, которая влияла на это, заключалась в том, что у меня была другая версия Python, установленная корнем, поэтому, если кто-то работает с локальной установкой python, убедитесь, что установка Python, на которой выполняются программы, является локальным Python. Чтобы проверить это, просто выполните which python и посмотрите, находится ли исполняемый файл в вашем локальном каталоге. Если нет, измените путь, но убедитесь, что локальный каталог Python находится раньше, чем другой каталог Python.
Проблема, с которой я столкнулся, заключалась в том, что модуль был (пере) установлен с помощью pip, и только пользователь root имел к нему доступ, поэтому пользователь, запустивший программу, не видел его.
@ JānisElmeris, не могли бы вы подробнее рассказать о приведенном выше комментарии, я думаю, что я тоже столкнулся с аналогичной ошибкой. Мои файлы __init__.py помещены в соответствующий каталог, но я вручную установил пакет с помощью setup.py. Как установка нового пакета помешала импорту.
@darth_coder, извини, это было шесть лет назад, и я не помню случая. Кроме того, я очень мало занимаюсь Python, совсем не в последнее время. Из того, что я написал, я могу просто подумать, что установил пакет как root, что изменило разрешения, так что другие пользователи не имели доступа, который у них был раньше.
Ага. Вам нужен каталог для хранения файла __init__.py, который инициализирует пакет. Вот посмотрите это.
The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.
В * nix также убедитесь, что PYTHONPATH настроен правильно, особенно, что он имеет этот формат:
.:/usr/local/lib/python
(Обратите внимание на .: вначале, чтобы он мог искать и в текущем каталоге.)
Он также может быть в других местах, в зависимости от версии:
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
Также это может быть .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7 и др. В зависимости от версии.
Для меня модуль находится в /usr/local/lib/python3.4/dist-packages, но когда я набираю python3 в терминале (ubuntu) и пытаюсь импортировать его, это не позволяет мне, говоря, что это не существует. «ImportError: модуль x не существует»
Добавление #!/usr/bin/python в конец файла тоже должно работать, верно?
@Nearoo Не думаю, что это сработает. Плюс обычно этот шебанг добавляется вверху файла.
В MacOSX исправлено, добавив PYTHONPATH = / usr / local / lib / python2.7 / site-packages в сценарии запуска.
В моем случае проблема заключалась в том, что я связывал отлаживатьpython и boost::Python, что требует, чтобы расширение было FooLib_d.pyd, а не только FooLib.pyd; переименование файла или обновление свойств CMakeLists.txt устранили ошибку.
например: / и т.д. / окружающая среда
PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2
/ opt / folder1 / foo
/ opt / folder2 / foo
И, если вы пытаетесь импортировать файл foo, python не узнает, какой из них вам нужен.
from foo import ... >>> importerror: нет модуля с именем foo
Я столкнулся с чем-то очень похожим, когда делал это упражнение в LPTHW; Я никогда не мог заставить Python распознавать, что у меня есть файлы в каталоге, из которого я звонил. Но в конце концов мне удалось заставить его работать. Я сделал и рекомендую попробовать следующее:
(ПРИМЕЧАНИЕ. Исходя из вашего первоначального сообщения, я предполагаю, что вы используете машину на базе * NIX и запускаете что-то из командной строки, поэтому этот совет адаптирован для этого. Поскольку я запускаю Ubuntu, это то, что я сделал)
1) Измените каталог (cd) на каталог выше - каталог, в котором находятся ваши файлы. В этом случае вы пытаетесь запустить файл mountain.py и пытаетесь вызвать модуль toolkit.interface.py, который находится в разных каталогах. В этом случае вы должны перейти в каталог, содержащий пути к обоим этим файлам (или, другими словами, в ближайший каталог, в котором находятся пути к обоим этим файлам). В данном случае это каталог toolkit.
2) Когда вы находитесь в каталоге tookit, введите эту строку кода в свою командную строку:
export PYTHONPATH=.
Это устанавливает для вашего PYTHONPATH значение ".", Что в основном означает, что ваш PYTHONPATH теперь будет искать любые вызываемые файлы в каталоге, в котором вы сейчас находитесь (и, что более важно, в филиалы подкаталога каталога, в котором вы находитесь. Так что это не так. не просто смотреть в ваш текущий каталог, а во все каталоги, которые являются в вашим текущим каталогом).
3) После того, как вы установили PYTHONPATH на шаге выше, запустите свой модуль из текущего каталога (каталога toolkit). Python теперь должен найти и загрузить указанные вами модули.
Надеюсь это поможет. Я сам был очень расстроен этим.
Или в Windows set PYTHONPATH=..
Это сработало для меня. Также ПОЛНОСТЬЮ упростил мои разочарования в PYTHONPATH, поскольку мне приходилось обновлять его до абсолютного пути каждый раз, когда я переключаю машины. Спасибо Спасибо спасибо.
Будьте осторожны, если у вас есть ссылки на сторонние или пользовательские библиотеки в уже существующей переменной среды PYTHONPATH. Если вы сделаете это вместо этого, запустите: set PYTHONPATH=%PYTHONPATH%;.;, чтобы добавить . к PYTHONPATH, а затем echo %PYTHONPATH%, который должен отобразить path\to\custom\library;.;. Затем запустите приложение из каталога приложений с помощью python applicationlaunchfile.py.
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
После того, как я столкнулся с той же проблемой, я обнаружил, что моим решением было удалить все файлы pyc из моего проекта, похоже, что эти кешированные файлы каким-то образом вызывали эту ошибку.
Самый простой способ, который я нашел для этого, заключался в том, чтобы перейти в папку моего проекта в проводнике Windows и найти *.pyc, затем выбрать все (Ctrl + A) и удалить их (Ctrl + X).
Возможно, я мог бы решить свои проблемы, просто удалив конкретный файл pyc, но я никогда не пробовал это
Мои два цента:

Плевать:
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». Мне было бы интересно найти обходной путь и / или ссылки, документирующие это (одноименное) поведение -> EDIT (2017.01.24) - взгляните на Что делать, если у меня есть модуль и пакет с тем же именем?. Интересно, что обычно пакеты имеет приоритет, но, очевидно, наша программа запуска нарушает это.
РЕДАКТИРОВАТЬ (2015.01.17): я не упоминал, что мы используем кастомная пусковая установка, рассеченный здесь.
больше похоже на то, что путь отключен. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Может потребоваться исправить это, добавив свой код Python для использования: game.oblivion.patchers.RecordGroups
@DwightSpencer: я уверен, что импортировал "RecordGroups" в game.oblivion.__init__.py, но, возможно, придется это проверить
Я столкнулся с той же проблемой: Import error. К тому же библиотека установлена на 100% правильно. Источником проблемы было то, что на моем ПК была установлена 3 версия python (пакет anaconda)). Поэтому библиотека была установлена не в нужное место. После этого я просто перешел на правильную версию python в моей IDE PyCharm.
Исправил мою проблему, написав print (sys.path) и обнаружив, что python использует устаревшие пакеты, несмотря на чистую установку. Удаление этих созданных python автоматически использует правильные пакеты.
У меня была такая же ошибка. Это было вызвано тем, что кто-то создал папку в той же папке, что и мой скрипт, имя которой противоречило имени модуля, который я импортировал из другого места. Вместо того, чтобы импортировать внешний модуль, он заглянул внутрь этой папки, которая явно не содержала ожидаемых модулей.
Используя PyCharm (часть пакета JetBrains), вам необходимо определить каталог вашего скрипта как Source: Right Click > Mark Directory as > Sources Root
Если вы пробовали все методы, представленные выше, но не смогли, возможно, ваш модуль имеет то же имя как встроенный модуль. Или модуль с то же имя, существующий в папке, которая имеет более высокий приоритет в sys.path, чем ваш модуль.
Для отладки скажите, что ваши from foo.bar import baz жалуются на ImportError: No module named bar. Переход на import foo; print foo, который покажет путь к foo. Вы этого ожидаете?
Если нет, либо переименуйте foo, либо используйте абсолютный импорт.
Для меня это дает ImportError: No module named foo.
простое решение - установить модуль с использованием python -m pip install <library-name> вместо pip install <library-name>
вы можете использовать sudo в случае ограничений администратора
Чего добивается python -m перед pip install?
@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). В любом случае это не имеет смысла.
Моя проблема заключалась в том, что я добавил каталог с файлом __init__.py в PYTHONPATH, хотя на самом деле мне нужно было добавить его родительский каталог.
У меня была такая же проблема (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 путает это с именами классов и именами файлов.
По-видимому, это была не ваша проблема, но ответ Джон Фухи очень хорош, и в этом потоке есть почти все, что может вызвать эту проблему. Итак, это еще одна вещь, и я надеюсь, что, возможно, это поможет другим.
В моем случае я указывал путь к папке package.egg, а не к фактическому пакету внизу. Я скопировал пакет на верхний уровень, и он сработал.
Вы читаете этот ответ, в котором говорится, что ваш __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>')
Вы можете использовать вставку / добавление в зависимости от порядка, в котором вы хотите, чтобы ваш проект просматривался.
Это то, что я сделал в качестве обходного пути. Но я до сих пор не понимаю, зачем это нужно. В моем файле Pipfile есть модуль относительного пути, который не может быть обнаружен (например, я получаю ImportError) без указанного обходного пути.
В моем случае, поскольку я использую PyCharm, и PyCharm создают «venv» для каждого проекта в папке проекта, но это всего лишь мини-env для python. Хотя вы установили необходимые библиотеки в Python, но в вашем пользовательском проекте venv они недоступны. Это настоящая причина ImportError: в PyCharm не было модуля с именем xxxxxx. Чтобы решить эту проблему, вы должны добавить библиотеки в пользовательский env вашего проекта, выполнив следующие действия:
Наслаждаться.
Это сработало для меня:
Создал файл __init__.py внутри родительской папки (в вашем случае внутри папки site-packages). И импортировал вот так:
from site-packages.toolkit.interface import interface
Надеюсь, это будет полезно и для вас!
Всем тем, у кого еще есть эта проблема. Я считаю, что Pycharm путают с импортом. Для меня, когда я пишу «from namespace import something», предыдущая строка подчеркивается красным цветом, сигнализируя об ошибке, но работает. Однако «from .namespace import something» не подчеркивается, но и не работает.
Пытаться
try:
from namespace import something
except NameError:
from .namespace import something
Первый - это синтаксис Python 2, второй - Python 3.
Для меня это было действительно глупо. Я установил библиотеку, используя pip3 install, но запускал свою программу как python program.py, а не python3 program.py.
Ты спас мне день.
На сервере linux попробуйте dos2unix script_name
(удалите все (если есть) файлы pyc командой find . -name '*.pyc' -delete)
и повторно запустить в том случае, если вы работали над скриптом в Windows
В моем случае я использовал sys.path.insert() для импорта локального модуля и получал module not found из другой библиотеки. Мне пришлось поместить sys.path.insert() ниже импорта, который сообщил о module not found. Я думаю, что лучше всего поместить sys.path.insert() в конец вашего импорта.
Если вы используете сценарий / утилиту установки (например, setuptools) для развертывания пакета, не забудьте добавить соответствующие файлы / модули в установщик.
Если поддерживается, используйте find_packages() или аналогичный для автоматического добавления новых пакетов в сценарий установки. Это абсолютно избавит вас от головной боли, особенно, если вы отложите свой проект на некоторое время, а затем добавите что-нибудь позже.
import setuptools
setuptools.setup(
name = "example-pkg",
version = "0.0.1",
author = "Example Author",
author_email = "[email protected]",
description = "A small example package",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)
(Пример взят из документация setuptools)
Я обнаружил, что изменение имени (через графический интерфейс) папок с псевдонимами (Mac) может вызвать проблемы с загрузкой модулей. Если исходное имя папки изменилось, переделайте символическую ссылку. Я не уверен, насколько распространенным может быть такое поведение, но отлаживать его было неприятно.
Убедитесь, что у вас есть разрешение на чтение этого файла из python. См .: stackoverflow.com/a/20999950/1657225