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


155

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

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


4
Вам нужно предоставить больше информации. Когда вы говорите «запустить сценарий», вы имеете в виду сценарий оболочки? Какой модуль вы не можете импортировать? Где находится этот модуль? Где находится ваш скрипт?
BrenBarn

2
Если вам нужен окончательный ответ на вопрос «что происходит», запустите python с -vопцией, и вы увидите, где python находит (или не находит) модули, которые вы импортируете.
FatalError

Что вы пытаетесь импортировать? Находятся ли два сценария Python в одном каталоге?
pynovice

2
Сообщите нам код, который вы выполняете, полный текст трассировки стека и точные шаги, которые вы предпринимаете для возникновения ошибки. Довольно сложно помочь, когда мы не знаем, в чем именно проблема.
MattDMo

6
Думаю, это проблема, с которой сталкиваются многие пользователи, даже через 4 года после того, как вопрос был впервые задан.
CodeOcelot

Ответы:


189

Эта проблема возникает из-за того, как интерпретатор командной строки 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 .


2
PSA: если вы пришли к этому вопросу SO, потому что вы получаете эту ошибку в jupyter-notebook, см. Ниже, stackoverflow.com/a/27944947/127971 К сожалению, этот вопрос недостаточно конкретен для единственного ответа.
Майкл

@michael, этот ответ касается импорта модулей Python в общем случае; файл dunder init.py необходим, когда интерпретатор ищет в каталогах модули для импорта, записные книжки или нет. Приведенный выше ответ о рабочем каталоге интерпретатора ноутбука и настройке PYTHONPATH верен.
BoltzmannBrain

Я сказал, что будет несколько правильных ответов из-за формулировки вопроса. Я не имею в виду этот ответ не правильный. Но если вы используете jupyter-notebook, вы просто прикоснетесь к файлу __init_.py, верно? ... и не захочется PYTHONPATHни изменять, ни вызывать sys.path.append, даже если они также верны (правильно?). Я имею в виду, что у меня есть десятки каталогов с кодом в них, и я не собираюсь добавлять их все в путь - или ожидать, что другие пользователи будут использовать их конфигурационный файл jupyter, даже если это один каталог.
Майкл

17

Просто создайте пустой файл python с именем __init__.pyв папке, в которой отображается ошибка, при запуске проекта python.


1
Под « init.py » вы имеете в виду «_ init_ .py», верно? Я создал _init_ .py как пустой файл, и у меня это сработало. Большое спасибо. Но зачем это нужно? Раньше у меня был сценарий python в том же каталоге, что и мой блокнот ipython, и импорт работал нормально.
Эдуардо Рейс

3
на самом деле init .py используется для обозначения python, чтобы указать, что в соответствующем месте содержится некий пакет. только тогда он найдет подмодули, которые вы создали под ним. если вы не создаете init .py, значит, python не знает, что в нем есть какой-то пакет. Например: из «Myfolder.Mypackage import Mymodules» для этого, например, вам следует запустить init .py, чтобы указать python, чтобы сообщить, что здесь есть какой-то пакет. иначе этого не знаю.
Mohideen bin Mohammed

1
Ага, отличный ответ. Это необходимо в python 2.7, но обратите внимание на 3
Agape Gal'lo

это устранило для меня проблему в python 3.
Рик поддерживает Монику

исправили проблему и для меня - с помощью ноутбука jupyter с исходным кодом python в подкаталоге файла ipynb; например, foo.ipynbиспользуя bar/baz.py, добавьте пустой bar/__init__.pyфайл, чтобы его можно было использовать в записной книжкеfrom bar.baz import MyClass
Майкл

14

Убедитесь, что они оба используют один и тот же интерпретатор. Это случилось со мной на 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.


Используя miniconda для установки кучи связанных с Python вещей, я также столкнулся с этой проблемой. Встроенный ubuntu python 2.7 отличается от miniconda python 2.7. Этот ответ позволил мне исправить проблему
bph,

4
Это была моя проблема. Я обновился до Python 2.7.11, но моя интерактивная оболочка iPython все еще использовала 2.7.5. Мне просто нужно было запустить, pip install --upgrade ipythonчтобы получить последнюю версию, а затем по умолчанию автоматически использовалась 2.7.11.
Abundnce10

Мой IPython - 7.4.0, а такой версии Python вообще нет.
aderchox

@aderchox Выполнить это в IPython , чтобы получить версию интерпретатора:import sys; sys.version
z0r

8

Основная причина в том, что 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")'
]

СДЕЛАННЫЙ


'ipython profile create' .... Да! Это единственное (постоянное) решение, которое касается jupyter notebook, не считывающего из окружения PATH и PYTHONPATH ... без использования запутанных операторов sys.path в начале каждого файла (yuk). спасибо @jesse.
JohnL_10

Решение @ z0r подтвердило мою проблему, но № 3 «Постоянное решение» здесь исправило ее для меня.
сафай

6

Выполнение sys.path.append('my-path-to-module-folder')будет работать, но чтобы избежать необходимости делать это в IPython каждый раз, когда вы хотите использовать модуль, вы можете добавить его export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"в свой ~/.bash_profileфайл.


2

Перед установкой ipython я устанавливал модули через easy_install; сказать sudo easy_install mechanize.

После установки ipython мне пришлось повторно запустить easy_install, чтобы ipython распознал модули.


2

Была аналогичная проблема, исправил ее путем вызова python3вместо python, мои модули были на Python3.5.


2

Если вы запускаете его из командной строки, иногда интерпретатор python не знает, где искать модули.

Ниже представлена ​​структура каталогов моего проекта:

/project/apps/..
/project/tests/..

Я выполнял команду ниже:

>> cd project

>> python tests/my_test.py

После выполнения вышеуказанной команды я получил ошибку ниже

no module named lib

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()получает каталог, в котором был запущен сценарий, а не каталог, в котором находится файл сценария.
Nathan Arthur

1

Вот как я это исправил:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)

1

Я обнаружил, что решение этой проблемы подробно описано здесь:

https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/

По сути, вы должны установить пакеты в среде Jupyter, выполнив такие команды оболочки, как:

!{sys.executable} -m pip install numpy

Пожалуйста, проверьте ссылку выше, чтобы получить достоверный полный ответ.


0

Я нашел еще один источник этого несоответствия:

У меня ipython установлен как локально, так и обычно в virtualenvs. Моя проблема заключалась в том, что внутри недавно созданного virtualenv с ipython был поднят системный ipython, который был другой версией, чем python и ipython в virtualenv (2.7.x против 3.5.x), и это повлекло за собой веселье.

Я думаю, что разумная вещь, которую нужно сделать при установке чего-то, что будет иметь двоичный файл, yourvirtualenv/bin- это немедленно запустить rehashили что-то подобное для любой оболочки, которую вы используете, чтобы выбрать правильный python / ipython. (Надо проверить, есть ли подходящие pipпослеустановочные хуки ...)


0

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

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

0

Вероятно, это вызвано разными версиями 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

0

Со мной случилось с каталогом utils. Я пытался импортировать этот каталог как:

from utils import somefile

utilsуже является пакетом на Python. Просто измените имя каталога на другое, и все должно работать нормально.


0

Подобные ошибки возникают, скорее всего, из-за конфликтов версий Python. Например, если ваше приложение работает только на python 3 и у вас также есть python 2, то лучше указать, какую версию использовать. Например, используйте

python3 .....

вместо того

python

0

Этот ответ относится к этому вопросу, если

  1. Вы не хотите менять свой код
  2. Вы не хотите менять PYTHONPATH навсегда

Временно изменить PYTHONPATH

путь ниже может быть относительным

PYTHONPATH=/path/to/dir python script.py


-1

Удалите pathlibи переустановите его. Удалите pathlib в sitepackagesпапке и переустановите пакет pathlib с помощью команды pip:

pip install pathlib
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.