Помилка Python "ImportError: модуль не названий"


452

Python встановлюється в локальному каталозі.

Моє дерево каталогів виглядає так:

(local directory)/site-packages/toolkit/interface.py

Мій код тут:

(local directory)/site-packages/toolkit/examples/mountain.py

Для запуску прикладу я пишу python mountain.py, а в коді я:

from toolkit.interface import interface

І я отримую помилку:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Я вже перевірив sys.pathі там у мене є каталог /site-packages. Також у мене є файл __init__.py.binу папці інструментарію, щоб вказати Python, що це пакет. У мене також є __init__.py.binкаталог у прикладах.

Я не знаю, чому Python не може знайти файл, коли він знаходиться sys.path. Будь-які ідеї? Чи може це бути проблема дозволів? Чи потрібен мені дозвіл на виконання?


3
Переконайтеся, що ви прочитали дозвіл на цей файл із python. Див: stackoverflow.com/a/20999950/1657225
CSN

1
Будь ласка, не забудьте позначити ваш каталог як "Ресурси корінь", щоб повідомляти PyCharm, що це пакет.
emmmphd

Проблема в моєму випадку полягала в тому, що дозволу на нові встановлені модулі не було 755. Це було через те, що umaskна апараті було 0027пов’язано з тим, що у othersнього не було readдозволу, що призводить до зчитування модуля. Додавання readдозволу вирішило мою проблему. Варто перевірити дозвіл після встановлення цільового каталогу.
anu

Спробуйте удар URL: stackoverflow.com/questions/47887614 / ...
Раван-25

можливо, ім'я локальної каталогів interface (було конфліктом).
Бенямін Джафарі

Відповіді:


267

На основі ваших коментарів до публікації orip, я думаю, що це сталося:

  1. Ви редагували __init__.pyу Windows.
  2. Редактор Windows додав щось недрукувальне, можливо повернення каретки (кінцевий рядок у Windows - це CR / LF; в unix це лише LF), або, можливо, CTRL-Z (віконний кінець файлу).
  3. Ви скористалися WinSCP, щоб скопіювати файл у свій вікно Unix.
  4. WinSCP подумав: "Тут є щось, що не є основним текстом; я покладу розширення .bin, щоб вказати бінарні дані."
  5. Відсутній __init__.py(зараз його називають __init__.py.bin) означає, що python не розуміє набір інструментів як пакет.
  6. Ви створюєте __init__.pyу відповідному каталозі і все працює ...?

50
Також імпортує python -c 'sys; print sys.path 'допомагає - іноді користувач розміщує файли в шлях, не сканований.
mikebabcock

1
Я використовую те саме, що не додає WinSCP .bin.
користувач

9
якщо у мене порожній "__init__.py", те ж саме станеться?
dietbacon

2
OMG, ти правиш! Це моя історія: 1. Ви редагували init .py на windows 2. Додав TAB замість пробілів 3. Ви багато в Google, доки не знайдете цю публікацію! ;)
Гбріан

1
Для мене проблемою було те, що я використовував, python driver.pyколи мені слід було користуватися python3 driver.pyз моменту встановлення pip3.
Ерік Вінер

72

Чи

(local directory)/site-packages/toolkit

мати __init__.py?

Щоб імпорт пройшов через ваші каталоги, кожен каталог повинен мати __init__.pyфайл.


1
Гарна думка! Зауваження: Починаючи з Python 3.3, будь-який каталог на sys.path з іменем, яке відповідає імені пакета, буде розпізнаний.
PatrickT

1
чи це не потрібно лише для відносних посилань на шлях? чому має мати кожен каталог?
Sonic Soul

56

Я натрапив на щось дуже схоже, коли я робив цю вправу в LPTHW; Я ніколи не міг змусити Python визнати, що я маю файли в каталозі, з якого я дзвонив. Але мені вдалося змусити його працювати зрештою. Що я зробив, і що я рекомендую, це спробувати це:

(ПРИМІТКА. З вашого початкового повідомлення я припускаю, що ви використовуєте машину на базі * NIX і виконуєте речі з командного рядка, тому ця порада пристосована до цього. Оскільки я запускаю Ubuntu, це я і зробив)

1) Змініть каталог (cd) в каталог над каталогом, де знаходяться ваші файли. У цьому випадку ви намагаєтеся запустити mountain.pyфайл і намагаєтесь викликати toolkit.interface.pyмодуль, який знаходиться в окремих каталогах. У цьому випадку ви перейдете до каталогу, який містить шляхи до обох цих файлів (або іншими словами, найближчого каталогу, яким діляться шляхи обох цих файлів). Який у цьому випадку toolkitкаталог.

2) Коли ви перебуваєте в tookitкаталозі, введіть цей рядок коду в командному рядку:

export PYTHONPATH=.

Це встановлює ваш PYTHONPATH на ".", Що в основному означає, що ваш PYTHONPATH тепер буде шукати будь-які викликані файли в каталозі, в якому ви зараз перебуваєте, (і ще більше, в галузях підкаталогу каталогу, в якому ви перебуваєте. Отже, він не просто шукає у вашому поточному каталозі, а у всіх каталогах, які знаходяться у вашому поточному каталозі).

3) Після того, як ви встановили ваш PYTHONPATH на кроці вище, запустіть свій модуль зі свого поточного каталогу ( toolkitкаталогу). Тепер Python повинен знайти та завантажити вказані вами модулі.

Сподіваюсь, це допомагає. Я був досить розчарований цим самим.


2
Або в Windows set PYTHONPATH=..
cjbarth

Це працювало для мене. Крім того, ПОЛНО спростив мої розлади PYTHONPATH, оскільки мені потрібно було б оновлювати його до абсолютного шляху щоразу, коли я перемикаю машини. Дякую
the_e

41

На * nix також переконайтесь, що PYTHONPATH налаштований правильно, особливо, що він має такий формат:

 .:/usr/local/lib/python

(Зверніть увагу .:на початку, щоб він міг шукати і в поточному каталозі.)

Також може бути в інших місцях, залежно від версії:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
Він також може бути .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7і т.д. , в залежності від версії
Микита Волков

Для мене модуль знаходиться в /usr/local/lib/python3.4/dist-packages, але коли я набираю python3 в терміналі (ubuntu) і намагаюся імпортувати його, він мені не дозволяє, кажучи, що це не існує. "ImportError: модуля x немає"
користувач65165

Додавання #!/usr/bin/pythonв кінці файлу теж має працювати, правда?
Неару

1
@Nearoo Я не думаю, що це спрацює. Плюс зазвичай цей шебанг додається у верхній частині файлу.
Рено

2
На MacOSX виправили це, додавши PYTHONPATH = / usr / local / lib / python2.7 / пакет-сайти до сценаріїв запуску.
Йохан Снігуз

23

Я вирішив власну проблему, і напишу резюме того, що було не так, і рішення:

Файл потрібно викликати точно __init__.py. Якщо розширення відрізняється, наприклад, у моєму випадку, .py.binтоді Python не може переміщатися через каталоги і не може знайти модулі. Для редагування файлів потрібно скористатися редактором Linux, наприклад vi або nano . Якщо ви користуєтесь редактором Windows, він запише деякі приховані символи.

Ще одна проблема, яка вплинула на це, полягала в тому, що у мене була інша версія Python, встановлена ​​коренем, тому, якщо хтось працює з локальною установкою python, будьте впевнені, що установка Python, яка виконує програми, є локальним Python. Щоб перевірити це, просто зробіть which pythonі подивіться, чи виконується він у вашому локальному каталозі. Якщо ні, змініть шлях, але переконайтеся, що локальний каталог Python раніше, ніж інший Python.


Проблема, яку я отримав, полягала в тому, що модуль був (повторно) встановлений через pip, щоб отримати доступ до нього тільки користувачу root, тому користувач, який запускав програму, не бачив цього.
Jānis Elmeris

@ JānisElmeris, чи можете ви детальніше зупинитися на вищезазначеному коментарі, я думаю, я також зіткнувся з подібною помилкою. У мене __init__.pyфайли розміщені у відповідному каталозі, але я встановив пакет вручну за допомогою setup.py. Як установка нового пакета заважатиме імпорту.
Крішна Оза

@darth_coder, вибачте, це було шість років тому, і я не пам'ятаю справи. Крім того, я маю справу з Python дуже мало, зовсім не останнім часом. З того, що я написав, я просто можу подумати, що я встановив пакет як root, який змінив дозволи, щоб інші користувачі не мали доступу до них раніше.
Яніс Елмеріс

19

просте рішення - встановити модуль, використовуючи python -m pip install <library-name>замість pip install <library-name> вас, ви можете використовувати sudo у випадку обмежень адміністратора


2
Чого python -mдосягають перед pip install?
sporc

1
@sporc - коли ви використовуєте прапор командного рядка -m, Python імпортує модуль або пакет для вас, а потім запустить його як сценарій. Якщо ви не використовуєте прапор -m, то названий вами файл запускається лише як сценарій.
Тоні Цикарон

Не впевнений, що ця відповідь намагається сказати, що Wrt python -m pip...працює, але pip...не зробив: вони фактично те саме, припускаючи, що вони насправді в одному pythonкаталозі. Можливо, спостережувана ситуація полягала в тому, що окрема pipпрограма не була доступна в старішому випуску python (але вона є в останніх 2.7 і 3.x). У такому випадку, the pythonбув у локальному virtualenv, а pipне був, тому python -m pip installвстановив би у локальному virtualenv, тоді як pipспробував би встановити в системний python (і не вдалося без sudo). У будь-якому випадку це не має сенсу.
Майкл

17

Щоб позначити каталог як пакет, потрібен файл з ім'ям __init__.py, чи допомагає це?


У мене вже є файл під назвою init .py.bin, якщо я зміню ім'я на init .py, тоді я отримую цю помилку: /__init__.py ", рядок 1" утиліти "," демонстрація "] ^ SyntaxError: недійсний синтаксис
Едуардо

Що в init .py? Опублікуйте це, як частину вашого питання.
S.Lott

Немає нічого, це порожньо. Це було з пакетом, який я завантажую, чи потрібно щось написати у файл ?.
Едуардо

@ S.Lott: вам не потрібно нічого ставити у свій init .py правда?
igorgue

1
@Eduardo. Ваш init .py отримує помилку. І ти кажеш, що це порожньо. Це складно примирити. І його не можна назвати init .py.bin - Python ігнорує цей файл. Як правило, в ньому нічого не може бути.
S.Lott

16

Використовуючи PyCharm(частина набору JetBrains), вам потрібно визначити каталог сценаріїв як Джерело:
Right Click > Mark Directory as > Sources Root


12

Ви читаєте цю відповідь, говорить про те, що ваш __init__.pyзнаходиться в потрібному місці, ви встановили всі залежності, і ви все ще отримуєте ImportError.

Я зіткнувся з подібною проблемою, за винятком того, що моя програма буде працювати нормально при запуску з використанням PyCharm, але вищезгадана помилка, коли я запускаю її з терміналу. Покопившись далі, я виявив, що PYTHONPATHв каталозі проекту не було запису. Отже, я встановив, що PYTHONPATHза твердженням Import працює на PyCharm, але не з терміналу :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Є ще один спосіб зробити це, використовуючи sys.path:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Ви можете використовувати вставку / додавання відповідно до порядку, в якому потрібно шукати ваш проект.


12

Для мене це було щось справді дурне. Я встановив бібліотеку за допомогою, pip3 installале запускав свою програму python program.pyна відміну від python3 program.py.


1
Оце Так ! Це теж спрацювало і для мене.
JavaDeveloper

1
Ти врятував мені день.
Аймен

7

Так. Вам потрібен каталог, який містить __init__.pyфайл, який є файлом, який ініціалізує пакет. Ось, подивіться на це .

Файли __init__.py необхідні, щоб Python трактував каталоги як пакунки, що містять; це робиться для того, щоб каталоги із загальною назвою, наприклад, рядком, ненавмисно приховували дійсні модулі, що з’являються пізніше на шляху пошуку модулів. У найпростішому випадку __init__.py може бути просто порожнім файлом, але він також може виконати код ініціалізації для пакета або встановити змінну __all__, описану пізніше.


6
  1. Ви повинні мати файл __ init__.py в тому самому каталозі, де це файл, який ви імпортуєте.
  2. Ви не можете спробувати імпортувати файл із однаковою назвою та бути файлом із 2-х папок, налаштованих на PYTHONPATH.

наприклад: / тощо / навколишнє середовище

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

І якщо ви намагаєтеся імпортувати файл foo, python не дізнається, який саме ви хочете.

від foo import ... >>> importterror: жоден модуль з ім'ям foo


5

Мої два центи:

введіть тут опис зображення

Коса:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Це збентежило пекло від мене - переглянуло пости та повідомлення, що наводили на думку про некрасиві хакерські системи (як ви бачите, мої __init__.pyбули всі). Добре виявляється, що game / oblivion.py та game / забыття плутали python, який виплюнув досить непосидний "Немає модуля з іменем RecordGroups". Мене зацікавило б урегулювання та / або посилання, що документують цю (однойменну) поведінку -> EDIT (2017.01.24) - подивіться, що якщо у мене є модуль та пакет із такою ж назвою?Цікаво, що зазвичай пакети мають перевагу, але, мабуть, наш пусковий механізм це порушує.

EDIT (2015.01.17): Я не згадав , ми використовуємо для користувача пускові розчленовані тут .


більше схожий на шлях. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Можливо, ви хочете виправити це, додавши код python для використання:game.oblivion.patchers.RecordGroups
Дуайт Спенсер

@DwightSpencer: Я впевнений, що імпортував "RecordGroups", game.oblivion.__init__.pyале, можливо, доведеться перевірити це
Mr_and_Mrs_D

4

Linux: Імпортні модулі розташовані в /usr/local/lib/python2.7/dist-packages

Якщо ви використовуєте модуль, зібраний на C, не забудьте chmod .so файл після sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

3

У моєму випадку проблема полягала в тому, що я посилався на налагодження python & boost::Python, що вимагає, щоб розширення було FooLib_d.pydне просто FooLib.pyd; перейменування файла або CMakeLists.txtвластивості оновлення виправили помилку.


3

Якщо ви спробували всі способи, передбачені вище, але не вдалися, можливо, ваш модуль має те саме ім'я , що і вбудований модуль. Або модуль з такою ж назвою, який існує у папці, яка має високий пріоритет уsys.path більший ніж у вашого модуля.

Щоб налагодити, скажіть свої from foo.bar import bazскарги ImportError: No module named bar. Змінюючись на import foo; print foo, який покаже шлях foo. Це те, чого ви очікуєте?

Якщо ні, то перейменуйте fooабо використовуйте абсолютний імпорт .


1
Для мене це дає ImportError: No module named foo.
alex

3

Моя проблема полягала в тому, що я додав каталог з __init__.pyфайлом до PYTHONPATH, коли насправді мені потрібно було додати його батьківський каталог.


3

Для всіх, хто все ще має це питання. Я вважаю, що Pycharm плутається з імпортом. Для мене, коли я пишу "з простору імен щось імпортує", попередній рядок підкреслюється червоним кольором, що сигналізує про помилку, але працює. Однак "" з імпорту. Namespace щось імпортувати "не підкреслюється, але також не працює.

Спробуйте

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
Перший - синтаксис python 2, другий - python 3.
Tanya Branagan

2

Виправив мою проблему, написавши print (sys.path)і з’ясував, що python використовує застарілі пакети, незважаючи на чисту установку. Видаляючи зроблений python, автоматично використовуйте правильні пакети.


2

У моєму випадку, оскільки я використовую PyCharm та PyCharm, створюю "venv" для кожного проекту в папці проекту, але це лише міні-env python. Хоча ви встановили потрібні бібліотеки в Python, але у власному власному проекті "venv" він недоступний. Це справжня причина "ImportError: жодного модуля з іменем xxxxxx" не було в PyCharm. Щоб вирішити цю проблему, потрібно додати бібліотеки до власної програми env за допомогою наступних кроків:

  • У PyCharm в меню "Файл" -> Налаштування
  • У діалоговому вікні налаштувань Проект: XXXProject-> Інтерпретатор проекту
  • Натисніть кнопку "Додати", вона покаже діалогове вікно "Доступні пакети"
  • Шукайте у вашій бібліотеці, натисніть «Встановити пакет»
  • Тоді весь необхідний пакет буде встановлений у вашій проектній спеціальній папці 'venv'.

Діалогове вікно налаштувань

Насолоджуйтесь.


0

Щойно зазнавши тієї ж проблеми, я виявив, що моя резолюція полягає в тому, щоб видалити всі pycфайли з мого проекту, схоже, ці кешовані файли якось спричинили цю помилку.

Найпростіший спосіб, який я знайшов для цього, - це перейти до моєї папки проекту в Провіднику Windows і шукати *.pyc, а потім вибирати всі ( Ctrl+ A) та видаляти їх ( Ctrl+ X).

Можливо, я міг би вирішити свої проблеми, просто видаливши конкретний pycфайл, але я цього не намагався


0

Я зіткнувся з тією ж проблемою: Import error. Крім того, бібліотека встановлена ​​на 100% правильно. Джерелом проблеми було те, що на моєму ПК встановлено 3 версії python (пакет анаконда)). Ось чому бібліотеку було встановлено не в потрібне місце. Після цього я просто змінився на належну версію python в моєму IDE PyCharm.


0

У мене була така ж помилка. Це було викликано тим, що хтось створив папку в тій самій папці, що і мій сценарій, ім'я якої суперечило модулю, який я імпортував з іншого місця. Замість того, щоб імпортувати зовнішній модуль, він заглянув у цю папку, яка, очевидно, не містила очікуваних модулів.


0

У мене була така ж проблема (Python 2.7 Linux), я знайшов рішення, і хотів би ним поділитися. У моєму випадку у мене була структура нижче:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

У 'main.py' я невдало спробував усі комбінації нижче:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

Рішення було набагато простіше, ніж я думав. Я перейменував папку «Буклет» в «Буклет», і все. Тепер Python може імпортувати запитання класу звичайно, використовуючи в коді 'main.py' код:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

З цього можу зробити висновок, що імена пакета (папки) типу "буклет" повинні починатися з малих регістрів, інакше Python плутає його з іменами класів та іменами файлів.

Мабуть, це не було вашою проблемою, але відповідь Джона Фузі дуже хороша, і ця тема має майже все, що може викликати це питання. Отже, це ще одне і я сподіваюся, що, можливо, це може допомогти іншим.


0

У моєму випадку я включав шлях до папки package.egg, а не фактичний пакет під ним. Я скопіював пакунок на найвищий рівень, і він спрацював.


0

Це працювало для мене: Створював __init__.py файл всередині батьківської папки (у вашому випадку, всередині site-packagesпапки). І імпортується так:

from site-packages.toolkit.interface import interface

Сподіваємось, це стане в нагоді і вам!


0

На сервері Linux спробуйте dos2unix script_name

(видаліть усі (якщо є) pycфайли з командоюfind . -name '*.pyc' -delete )

і запустіть у випадку, якщо ви працювали над скриптом на Windows


0

У моєму випадку я використовував sys.path.insert()імпорт локального модуля і отримував module not foundз іншої бібліотеки. Мені довелося поставити sys.path.insert()нижче імпорту, який повідомив module not found. Я вважаю, що найкраща практика полягає в тому, щоб поставити sys.path.insert()на дно ваш імпорт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.