"ImportError: No module named" при попытке запустить Python script
Я пытаюсь запустить script, который запускает, среди прочего, python script. Я получаю ImportError: No module named..., однако, если я запускаю ipython и импортирую тот же модуль таким же образом через интерпретатор, модуль принимается.
Что происходит, и как я могу это исправить? Я попытался понять, как Python использует PYTHONPATH, но я полностью смущен. Любая помощь была бы весьма признательна.
Ответы
Ответ 1
Эта проблема возникает из-за того, как интерпретатор 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 в качестве глобального var зависит от os и подробно обсуждается здесь для Unix или Windows.
Ответ 2
Просто создайте пустой файл python с именем __init__.py
под папкой, отображающей ошибку, при запуске проекта python.
Ответ 3
Убедитесь, что они оба используют одного и того же переводчика. Это случилось со мной в 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.
Ответ 4
Выполнение sys.path.append('my-path-to-module-folder')
будет работать, но чтобы избежать необходимости делать это в IPython каждый раз, когда вы хотите использовать модуль, вы можете добавить export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
в ваш ~/.bash_profile
файл.
Ответ 5
Основная причина в том, что 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")'
]
DONE
Ответ 6
Перед установкой ipython я установил модули через easy_install; скажем sudo easy_install mechanize
.
После установки ipython мне пришлось повторно запустить easy_install для ipython для распознавания модулей.
Ответ 7
Если вы используете его из командной строки, иногда интерпретатор python не знает пути поиска модулей.
Ниже представлена структура каталогов моего проекта:
/project/apps/..
/project/tests/..
Я работал под командой:
>> cd project
>> python tests/my_test.py
После выполнения команды я я получил ошибку ниже
no module named lib
lib был импортирован в my_test.py
i напечатал sys.path и понял, что путь проекта, над которым я работаю, недоступен в списке sys.path
i добавил код ниже в начале моего script 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)
Я не уверен, что это хороший способ решить это, но да, это помогло мне.
Ответ 8
Имел подобную проблему, исправил ее, вызывая python3
вместо python
, мои модули находились в Python3.5.
Ответ 9
Я обнаружил, что решение этой проблемы было подробно задокументировано здесь:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
По сути, вы должны установить пакеты в среде Jupyter, выполнив такие команды оболочки, как:
!{sys.executable} -m pip install numpy
Пожалуйста, проверьте вышеуказанную ссылку для полного ответа.
Ответ 10
Вот как я его исправил:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
sys.path.append(module_path)
Ответ 11
Я нашел еще один источник этого несоответствия:
У меня есть ipython, установленный как локально, так и обычно в virtualenvs. Моя проблема заключалась в том, что внутри вновь созданного virtualenv с ipython была подобрана система ipython, которая была другой версией, чем python и ipython в virtualenv (2.7.x против 3.5.x), и веселье последовало.
Я думаю, что всякий раз, когда вы устанавливаете что-то, что будет иметь двоичный код в yourvirtualenv/bin
, нужно немедленно запустить rehash
или аналогичный для любой используемой вами оболочки, чтобы получить правильный питон /ipython. (Обязательно проверьте, есть ли подходящие pip
после установки крючки...)
Ответ 12
Решение без скриптов:
- Откройте Spyder → Инструменты → PYTHONPATH менеджер
- Добавьте пути Python, нажав "Добавить путь". Например: 'C:\Users\User\AppData\Local\Programs\Python\Python37\Lib\site-packages'
- Нажмите "Синхронизировать...", чтобы другие программы (например, Jupyter Notebook) могли использовать pythonpaths, заданные в шаге 2.
- Перезапустите Jupyter, если он открыт
Ответ 13
Это, вероятно, вызвано различными версиями 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
с приведенной ниже командой
$ python3 example.py
Ответ 14
Случилось со мной с каталогом utils
. Я пытался импортировать этот каталог как:
from utils import somefile
utils
уже является пакетом на python. Просто измените имя своего каталога на что-то другое, и оно должно работать нормально.
Ответ 15
Подобные ошибки возникают, скорее всего, из-за конфликтов версий Python. Например, если ваше приложение работает только на Python 3, а у вас также есть Python 2, то лучше указать, какую версию использовать.
Например, используйте
python3 .....
вместо
python
Ответ 16
удалить pathlib и переустановить его.
Удалите папку pathlib в папке sitepackages и переустановите пакет pathlib с помощью команды pip.
pip install pathlib