Подтвердить что ты не робот

"ImportError: No module named" при попытке запустить Python script

Я пытаюсь запустить script, который запускает, среди прочего, python script. Я получаю ImportError: No module named..., однако, если я запускаю ipython и импортирую тот же модуль таким же образом через интерпретатор, модуль принимается.

Что происходит, и как я могу это исправить? Я попытался понять, как Python использует PYTHONPATH, но я полностью смущен. Любая помощь была бы весьма признательна.

4b9b3361

Ответ 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

Решение без скриптов:

  1. Откройте Spyder → Инструменты → PYTHONPATH менеджер
  2. Добавьте пути Python, нажав "Добавить путь". Например: 'C:\Users\User\AppData\Local\Programs\Python\Python37\Lib\site-packages'
  3. Нажмите "Синхронизировать...", чтобы другие программы (например, Jupyter Notebook) могли использовать pythonpaths, заданные в шаге 2.
  4. Перезапустите 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