"ImportError: модуль не названий" при спробі запуску сценарію Python


144

Я намагаюся запустити сценарій, який, серед іншого, запускає сценарій пітона. Я отримую ImportError: Немає модуля з іменем ..., однак, якщо я запускаю ipython і імпортую той самий модуль тим же способом через інтерпретатор, модуль приймається.

Що відбувається, і як я можу це виправити? Я намагався зрозуміти, як python використовує PYTHONPATH, але я сильно розгублений. Будь-яка допомога буде дуже вдячна.


4
Вам потрібно надати більше інформації. Коли ви говорите "запустити сценарій", ви маєте на увазі сценарій оболонки? Який модуль неможливо імпортувати? Де знаходиться цей модуль? Де знаходиться ваш сценарій?
BrenBarn

2
Якщо ви хочете отримати остаточну відповідь на "що відбувається", запустіть python з цієї -vопції, і ви побачите, де python знаходиться (чи ні) знаходить модулі, які ви імпортуєте.
FatalError

Що ви намагаєтеся імпортувати? Чи два сценарії python в одному каталозі?
pynovice

2
Будь ласка, дайте нам код, який ви виконуєте, повний текст сліду стека та точні кроки, які ви робите для створення помилки. Досить складно надати допомогу, коли ми не знаємо, яка саме проблема.
MattDMo

5
Я думаю, що це проблема у багатьох користувачів навіть через 4 роки після того, як це питання було вперше задано.
CodeOcelot

Відповіді:


183

Ця проблема виникає через те, як командний рядок інтерпретатор 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 .


1
PSA: якщо ви прийшли до цього питання ТАК, оскільки ви отримуєте цю помилку в jupyter-notebook, то дивіться нижче, stackoverflow.com/a/27944947/127971 На жаль, питання недостатньо конкретне для однозначної відповіді.
Майкл

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

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

16

Просто створіть порожній файл 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, щоб сказати, що тут є якийсь пакет. інакше це не знає.
Мохіден бен Мухаммед

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
Майклу

13

Переконайтесь, що вони обидва використовують одного і того ж перекладача. Це сталося зі мною на 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 за замовчуванням.
Побачення10

Мій IPython - це 7.4.0, поки взагалі немає такої версії Python.
aderchox

@aderchox Запустіть це в ipython, щоб отримати версію перекладача:import sys; sys.version
z0r

7

Основна причина - sys.paths Python та IPython різні.

Перейдіть за посиланням lucypark , рішення працює в моєму випадку. Це відбувається при встановленні opencv by

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 shell:

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

In vi, додайте до файлу:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

Зроблено


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

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()отримує каталог, де був запущений сценарій, а не каталог, де живе файл сценарію.
Натан Артур

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 manager
  2. Додайте шляхи Python, натиснувши "Додати шлях". Наприклад: 'C: \ Користувачі \ Користувач \ AppData \ Місцеві \ Програми \ Python \ Python37 \ Lib \ сайт-пакети'
  3. Клацніть "Синхронізувати ...", щоб дозволити іншим програмам (наприклад, Jupyter Notebook) використовувати пітонні шляхи, встановлені на кроці 2.
  4. Перезапустіть Юпітер, якщо він відкритий

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.