Я пытаюсь запустить скрипт, который, помимо прочего, запускает скрипт Python. Я получаю сообщение ImportError: No module named ..., однако, если я запускаю ipython и импортирую тот же модуль таким же образом через интерпретатор, модуль будет принят.
Что происходит, и как это исправить? Я пытался понять, как python использует PYTHONPATH, но я полностью запутался. Любая помощь будет принята с благодарностью.
python
ipython
jupyter-notebook
importerror
КодОцелот
источник
источник
-v
опцией, и вы увидите, где python находит (или не находит) модули, которые вы импортируете.Ответы:
Эта проблема возникает из-за того, как интерпретатор командной строки IPython использует ваш текущий путь по сравнению с тем, как это делает отдельный процесс (будь то ноутбук IPython, внешний процесс и т. Д.). IPython будет искать модули для импорта, которые находятся не только в вашем sys.path, но и в вашем текущем рабочем каталоге. При запуске интерпретатора из командной строки текущий каталог, в котором вы работаете, совпадает с тем, в котором вы запустили ipython. Если вы запустите
import os os.getcwd()
вы увидите, что это правда.
Однако предположим, что вы используете блокнот ipython, запустите,
os.getcwd()
и ваш текущий рабочий каталог - это папка, из которой вы указали блокноту работать в вашем файле ipython_notebook_config.py (обычно с использованием этогоc.NotebookManager.notebook_dir
параметра).Решение состоит в том, чтобы предоставить интерпретатору Python путь к вашему модулю. Самое простое решение - добавить этот путь в список sys.path. В записной книжке сначала попробуйте:
import sys sys.path.append('my/path/to/module/folder') import module-of-interest
Если это не сработает, у вас возникла другая проблема, не связанная с путем к импорту, и вам следует предоставить дополнительную информацию о своей проблеме.
Лучший (и более постоянный) способ решить эту проблему - установить PYTHONPATH , который предоставляет интерпретатору дополнительные каталоги для поиска пакетов / модулей python. Редактирование или установка PYTHONPATH как глобальной переменной зависит от ОС и подробно обсуждается здесь для Unix или Windows .
источник
__init_.py
, верно? ... и не захочетсяPYTHONPATH
ни изменять, ни вызыватьsys.path.append
, даже если они также верны (правильно?). Я имею в виду, что у меня есть десятки каталогов с кодом в них, и я не собираюсь добавлять их все в путь - или ожидать, что другие пользователи будут использовать их конфигурационный файл jupyter, даже если это один каталог.Просто создайте пустой файл python с именем
__init__.py
в папке, в которой отображается ошибка, при запуске проекта python.источник
foo.ipynb
используяbar/baz.py
, добавьте пустойbar/__init__.py
файл, чтобы его можно было использовать в записной книжкеfrom bar.baz import MyClass
Убедитесь, что они оба используют один и тот же интерпретатор. Это случилось со мной на Ubuntu:
$ ipython3 -c 'import sys; print(sys.version)' 3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1] $ python3 -c 'import sys; print(sys.version)' 3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]
И
sys.path
между двумя переводчиками было иначе. Чтобы исправить это, я удалил Python 3.3.источник
pip install --upgrade ipython
чтобы получить последнюю версию, а затем по умолчанию автоматически использовалась 2.7.11.import sys; sys.version
Основная причина в том, что sys.path Python и IPython разные.
Пожалуйста, обратитесь к ссылке lucypark , решение работает в моем случае. Это происходит при установке opencv с помощью
conda install opencv
В iPython возникла ошибка импорта. Для решения этой проблемы необходимо выполнить три шага:
import cv2 ImportError: ...
1. Проверьте путь в Python и iPython с помощью следующей команды
import sys sys.path
Вы найдете разные результаты от Python и Jupyter. Второй шаг, просто используйте,
sys.path.append
чтобы исправить пропущенный путь методом проб и ошибок.2. Временное решение
В iPython:
import sys sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages') import cv2
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")' ]
СДЕЛАННЫЙ
источник
Выполнение
sys.path.append('my-path-to-module-folder')
будет работать, но чтобы избежать необходимости делать это в IPython каждый раз, когда вы хотите использовать модуль, вы можете добавить егоexport PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
в свой~/.bash_profile
файл.источник
Перед установкой ipython я устанавливал модули через easy_install; сказать
sudo easy_install mechanize
.После установки ipython мне пришлось повторно запустить easy_install, чтобы ipython распознал модули.
источник
Была аналогичная проблема, исправил ее путем вызова
python3
вместоpython
, мои модули были на Python3.5.источник
Если вы запускаете его из командной строки, иногда интерпретатор python не знает, где искать модули.
Ниже представлена структура каталогов моего проекта:
Я выполнял команду ниже:
После выполнения вышеуказанной команды я получил ошибку ниже
lib был импортирован в my_test.py
Я напечатал sys.path и выяснил, что путь к проекту, над которым я работаю, недоступен в списке sys.path
я добавил код ниже в начале моего скрипта
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)
Я не уверен, что это хороший способ решить эту проблему, но да, это сработало для меня.
источник
os.getcwd()
получает каталог, в котором был запущен сценарий, а не каталог, в котором находится файл сценария.Вот как я это исправил:
import os import sys module_path = os.path.abspath(os.getcwd() + '\\..') if module_path not in sys.path: sys.path.append(module_path)
источник
Я обнаружил, что решение этой проблемы подробно описано здесь:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
По сути, вы должны установить пакеты в среде Jupyter, выполнив такие команды оболочки, как:
Пожалуйста, проверьте ссылку выше, чтобы получить достоверный полный ответ.
источник
Я нашел еще один источник этого несоответствия:
У меня ipython установлен как локально, так и обычно в virtualenvs. Моя проблема заключалась в том, что внутри недавно созданного virtualenv с ipython был поднят системный ipython, который был другой версией, чем python и ipython в virtualenv (2.7.x против 3.5.x), и это повлекло за собой веселье.
Я думаю, что разумная вещь, которую нужно сделать при установке чего-то, что будет иметь двоичный файл,
yourvirtualenv/bin
- это немедленно запуститьrehash
или что-то подобное для любой оболочки, которую вы используете, чтобы выбрать правильный python / ipython. (Надо проверить, есть ли подходящиеpip
послеустановочные хуки ...)источник
Решение без скриптов:
источник
Вероятно, это вызвано разными версиями python, установленными в вашей системе , например python2 или python3 .
Запустите команду
$ pip --version
и$ pip3 --version
проверьте, из какого пункта находится Python 3x . Например, вы должны увидеть информацию о версии, как показано ниже:pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
Затем запустите
example.py
сценарий с помощью команды нижеисточник
Со мной случилось с каталогом
utils
. Я пытался импортировать этот каталог как:from utils import somefile
utils
уже является пакетом на Python. Просто измените имя каталога на другое, и все должно работать нормально.источник
Подобные ошибки возникают, скорее всего, из-за конфликтов версий Python. Например, если ваше приложение работает только на python 3 и у вас также есть python 2, то лучше указать, какую версию использовать. Например, используйте
вместо того
источник
Этот ответ относится к этому вопросу, если
Временно изменить PYTHONPATH
путь ниже может быть относительным
источник
import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') import ta
источник
Удалите
pathlib
и переустановите его. Удалите pathlib вsitepackages
папке и переустановите пакет pathlib с помощью команды pip:источник