"ImportError: нет модуля с именем" при попытке запустить скрипт Python



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



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

729   11  

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 cv2

the 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 lib

lib был импортирован внутри 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

    Ничего не найдено.