"ImportError: нет модуля с именем" при попытке запустить скрипт Python
Я пытаюсь запустить скрипт, который запускает, среди прочего, скрипт Python. Я получаю ImportError: без имени модуля ... однако, если я запускаю ipython и импортирую тот же модуль таким же образом через интерпретатор, модуль принимается.
Что происходит, и как я могу это исправить? Я пытался понять, как python использует PYTHONPATH, но я полностью запутался. Любая помощь будет очень признательна.
11 ответов:
эта проблема возникает из-за того, как интерпретатор IPython командной строки использует ваш текущий путь по сравнению с тем, как это делает отдельный процесс (будь то ноутбук IPython, внешний процесс и т. д.). IPython будет искать модули для импорта, которые не только находятся в вашей системе.путь, но и в вашем текущем рабочем каталоге. При запуске интерпретатора из командной строки текущий каталог, в котором вы работаете, является тем же, в котором вы запустили ipython. Если вы беги
import os os.getcwd()вы увидите, что это правда.
однако, допустим, вы используете ноутбук ipython, запустите
os.getcwd()и ваш текущий рабочий каталог-это папка, в которой вы сказали ноутбуку работать из вашего ipython_notebook_config.py файл (обычно с помощьюc.NotebookManager.notebook_dirнастройки).решение состоит в том, чтобы предоставить интерпретатору python путь к вашему модулю. Самое простое решение-добавить этот путь к вашей системе.список путей. В ноутбук, первая попытка:
import sys sys.path.append('my/path/to/module/folder') import module-of-interestесли это не сработает, у вас есть другая проблема на ваших руках, не связанная с путем к импорту, и вы должны предоставить дополнительную информацию о своей проблеме.
лучший (и более постоянный) способ решить эту проблему-установить ваш PYTHONPATH, который предоставляет интерпретатору дополнительные каталоги для поиска пакетов/модулей python. Редактирование или установка PYTHONPATH в качестве глобального var зависит от ос и подробно обсуждается здесь для Unix или Windows.
просто создайте пустой файл python с именем
__init__.pyв папке, которая показывает ошибку, во время запуска проекта python.
убедитесь, что они оба используют один и тот же переводчик. Это случилось со мной на Ubuntu:
$ ipython3 > sys.version '3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]' $ python3 > sys.version '3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]'и
sys.pathбыло по-разному между двумя переводчиками. Чтобы исправить это, я удалил Python 3.3.
делаешь
sys.path.append('my-path-to-module-folder')будет работать, но чтобы избежать необходимости делать это в IPython каждый раз, когда вы хотите использовать модуль, вы можете добавитьexport PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"на .
основная причина-это sys.пути Python и IPython различны.
пожалуйста, обратитесь к lucypark link такое решение работает в моем случае. Это произошло, когда установите использованием OpenCV с помощью
conda install opencvи получил ошибку импорта в IPython, есть три шага, чтобы решить эту проблему:
import cv2 ImportError: ...1. Проверьте путь в Python и iPython с помощью следующей команды
import sys sys.pathвы должны находим у них разный результат. Второй шаг, просто используйте
sys.path.appendчтобы исправить пропущенный путь с помощью try-and-error.2. Временное решение
в iPython:
import sys sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages') import cv2the
ImportError:..проблема решена3. Постоянное решение
создайте профиль iPython и установите начальное добавление:
в оболочке bash:
ipython profile create ... CHECK the path prompted , and edit the prompted config file like my case vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.pyв vi, добавить к файл:
c.InteractiveShellApp.exec_lines = [ 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")' ]сделал
перед установкой ipython, я установил модули через easy_install; say
sudo easy_install mechanize.после установки ipython мне пришлось повторно запустить easy_install для ipython, чтобы распознать модули.
если вы запускаете его из командной строки, иногда интерпретатор python не знает пути, где искать модули.
Ниже приведена структура каталогов моего проекта:
/project/apps/.. /project/tests/..Я бежал ниже команды:
>> cd project >> python tests/my_test.pyпосле выполнения вышеуказанной команды, я получил ниже ошибки
no module named liblib был импортирован внутри my_test.py
я напечатал sys.путь и выяснил, что путь проекта, над которым я работаю, недоступен в системный.список путей
я добавил ниже код в начале моего скрипта
my_test.py.import sys import os module_path = os.path.abspath(os.getcwd()) if module_path not in sys.path: sys.path.append(module_path)Я не уверен, что это хороший способ решить эту проблему, но да, это сработало для меня.
была аналогичная проблема, исправлена путем вызова
python3вместоpython, мои модули были в Python3.5.
Я нашел еще один источник этого несоответствия:
у меня ipython установлен как локально, так и обычно в virtualenvs. Моя проблема заключалась в том, что внутри недавно созданного virtualenv с ipython был выбран системный ipython, который был другой версией, чем python и ipython в virtualenv (a 2.7.х и 3.5.x), и последовало веселье.
Я думаю, что умная вещь, чтобы сделать всякий раз, когда установка что-то, что будет иметь двоичный файл в
yourvirtualenv/binэто сразу же бегиrehashили аналогично для любой оболочки, которую вы используете, чтобы получить правильный python/ipython. (Нужно проверить, есть ли подходящиеpipпосле установки крючков...)
удалите pathlib и переустановите его.
удалите pathlib в папке sitepackages и переустановите пакет pathlib с помощью команды pip.
pip install pathlib
вот как я это исправил:
import os import sys module_path = os.path.abspath(os.getcwd() + '\..') if module_path not in sys.path: sys.path.append(module_path)
Comments