Неможливо імпортувати модуль, який точно встановлено


144

Встановивши механізм , я, здається, не зможу імпортувати його.

Я спробував встановити з pip, easy_install та через python setup.py installцей репо: https://github.com/abielr/mechanize . Все це безрезультатно, оскільки кожного разу, коли я вступаю в свій інтерактивний Python, я отримую:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mechanize
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mechanize
>>> 

Установки, якими я керував раніше, повідомили, що вони завершилися успішно, тому я очікую, що імпорт запрацює. Що може спричинити цю помилку?


Чи можете ви показати нам результат бігу easy_install? Крім того , будь ласка , перевірте повний шлях easy_install, pipі з python.
larsks

Ви впевнені, що він не встановлений до 2.6 (що за замовчуванням для ubuntu? (Принаймні, це на моїй debian)
dav1d

добре, вихід з простого встановлення показує, що він встановлений на 2.7: встановлений /usr/local/lib/python2.7/dist-packages/mechanize-0.2.6.dev_20130112-py2.7.egg
roy

@larks - додав цю інформацію в orginal post
roy

Я щойно намагався це в будь-який спосіб - setup.py, easy_install, pip - від pypi та repo, але не можу змусити його вийти з ладу. Чи можете ви перевірити, sys.pathчи шукаєте ви в потрібних місцях, ls -laR /usr/local/lib/python2.7/dist-packages/mech*щоб перевірити наявність проблем з дозволами та перегляньте, imp.find_module("mechanize")щоб розрізняти помилки, які не знаходять - не можуть пережити-імпортувати?
DSM

Відповіді:


100

У моєму випадку це проблема дозволу. Пакет якимось чином було встановлено лише з дозволом root rw, інший користувач просто не може перейти на нього!


26
Це сталося зі мною, просто бігаючи sudo pip install .... Просте виправлення:sudo chmod -R ugo+rX /lib/python2.7/site-packages/
jozxyqk

3
Я стикався з цим багато разів, і я думаю, що щойно я виявив причину: umask передається через sudo, тому якщо ваш особистий umask щільний, а ви використовуєте sudo для встановлення, файли та каталоги будуть занадто обмежені. Якщо ви просто спочатку су, а потім зробите встановлення з повної кореневої оболонки, отримана установка може бути корисною (принаймні, це для мене). Це було для pip, але може стосуватися і apt-get. Якщо інші підтверджують цю причину, можливо, хочуть відповідно змінити відповідь?
Брандін

Додавання до коментарів jozxyqk: переконайтеся, що ви отримали потрібний каталог, зробивши $ pip show <package_name>
Federico

2
Те саме для мене. Я працюю з Python 3.6 на Mac, тому sudo chmod 777 /usr/local/lib/python3.6/site-packagesзробив трюк
Антоніо Серрано

3
sudo 777 - це завжди дуже погана ідея
Marx

81

У мене була така ж проблема: сценарій з import coloramaкидком та ImportError, але sudo pip install coloramaговорив мені, що "пакет уже встановлений".

Моя помилка : запустити піп без Судо : pip install colorama. Тоді pip погодився, що його потрібно встановити, встановити, і мій сценарій запустився.

Моє середовище 32-розрядний Ubuntu 14.04; Думаю, я бачив це до і після того, як активізував свій virtualenv.

ОНОВЛЕННЯ : ще краще, використовуйте python -m pip install <package>. Перевага в цьому полягає в тому, що ви виконуєте конкретну версію python, в якій ви хочете отримати пакет, pip однозначно встановить пакет у "правильний" пітон. Знову ж таки, не використовуйте судо в цьому випадку ... тоді ви отримаєте пакет у потрібному місці, але, можливо, з (небажаними) кореневими дозволами.


1
Ви також можете використовувати прапор sudo's -H
Graydyn Young

21

Це проблема шляху пітона.

У моєму випадку я встановив python у:

/Library/Frameworks/Python.framework/Versions/2.6/bin/python,

і в python2.6 немає каталогу сайтів пакунків.

Пакет (SOAPpy), який я встановив за допомогою pip, знаходиться

/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

І сайт-пакет не знаходиться в шляху python, все, що я робив, - це додавати пакунки для сайтів в PYTHONPATH постійно.

  1. Відкрити термінал
  2. Введіть відкритий .bash_profile
  3. У текстовому файлі, що спливе, додайте цей рядок наприкінці:

    експортувати PYTHONPATH = $ PYTHONPATH: /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

  4. Збережіть файл, перезавантажте Термінал, і все закінчиться

Це працювало для мене, коли Дженкінс працював із селеновим пітоном.
EDST

Це працювало для мене в управлінні селерою через супервізора, коли мій сценарій bash називав мій сценарій селери; Сценарій селери не міг імпортувати вже встановлені модулі всередині мого піп. Дякую тонну.
Shivam Sharma

Примітка. Інша можливість помилки імпорту полягає в тому, що у вас на комп’ютері встановлено кілька версій Python. Наприклад, один із Python системи та один від Miniconda або Anaconda. Тому обов'язково завжди використовуйте правильний відповідний "піп".
Санчіт

8

Механізм імпорту Python працює, насправді, так:

  1. Ваш PYTHONPATH помиляється,
  2. Ваша бібліотека не встановлена ​​там, де ви думаєте, що вона є
  3. У вас є ще одна бібліотека з такою ж назвою, що маскує цю

1
У цьому випадку це не може бути варіант 3; це не кине ImportError.
Martijn Pieters

2
може 2? Я просто не знаю, чому він встановиться в неправильному місці для цієї однієї бібліотеки, де більшість інших добре.
Рой

3
Варіант 4: Ваш PYTHONPATH правильний, у вашій бібліотеці є те, де ви цього хочете, у вас немає бібліотеки, що маскує це ... але тому, що ви використовували sudo pip installйого, встановили разом із root-приватними приводами, а під час імпорту щось бомбардує через відсутність доступ для читання або запису.
Dan H

2
Не зовсім вірно, @MartijnPieters: якби був імпорт форми "з <package> import <foo>", а якщо в перешкоджаючому пакеті не було "foo", ви отримаєте помилку імпорту для варіанту 3.
Dan H

@DanH впевнений, але це не форма, яку використовує ОП.
Martijn Pieters

8

Я на цьому мовчав головою об монітор, поки молодий хіп-стажер не сказав мені, що секрет полягає в тому, щоб "встановити python setup.py" всередині каталогу модулів.

Чомусь запуск установки звідти змушує її просто працювати.

Щоб було зрозуміло, якщо назва вашого модуля "foo":

[burnc7 (2016-06-21 15:28:49) git]# ls -l
total 1
drwxr-xr-x 7 root root  118 Jun 21 15:22 foo
[burnc7 (2016-06-21 15:28:51) git]# cd foo
[burnc7 (2016-06-21 15:28:53) foo]# ls -l
total 2
drwxr-xr-x 2 root root   93 Jun 21 15:23 foo
-rw-r--r-- 1 root root  416 May 31 12:26 setup.py
[burnc7 (2016-06-21 15:28:54) foo]# python setup.py install
<--snip-->

Якщо ви спробуєте запустити setup.py з будь-якого іншого каталогу, викликаючи його шлях, ви закінчите встановлену програму.

НЕ ПРАЦЮЄ:

python /root/foo/setup.py install

РОБОТА:

cd /root/foo
python setup.py install

7

Мені вдалося виправити це питання комбінованим підходом. По-перше, я дотримувався поради Кріса, відкрив командний рядок і набрав 'pip show ім'я пакета'. Це забезпечило розташування встановленого пакету.

Потім я відкрив python і набрав 'import sys', потім 'sys.path', щоб показати, де мій python шукає будь-які пакунки, які я імпортую. На жаль, місце, показане на першому кроці, НЕ було у списку.

Заключний крок я набрав 'sys.path.append (' package_location_seen_in_step_1 '). Ви необов'язково можете повторити крок другий, щоб побачити місце тепер у списку.

Крок тестування, спробуйте імпортувати пакет ще раз ... він працює.

Мінус? Це тимчасово, і вам потрібно кожного разу додавати його до списку.


5

Я зіткнувся з цим під час спроби використовувати брелок, який я встановив через sudo pip install keyring. Як було сказано в інших відповідях, у моєму випадку це питання дозволу.

Що для мене спрацювало:

  1. Видалення брелоків:
    • sudo pip uninstall keyring
  2. Я використав -Hопцію sudo та перевстановив брелоки:
    • sudo -H pip install keyring

Сподіваюся, це допомагає.



2

Я не міг змусити PYTHONPATH працювати належним чином. Я зрозумів, що exportвирішив проблему:

(зробив роботу)

export PYTHONPATH=$PYTHONPATH:~/test/site-packages

vs.

(не працює)

PYTHONPATH=$PYTHONPATH:~/test/site-packages

2

У моєму випадку я бігав, pip install Django==1.11і це не імпортувало б з pythonперекладача.

Переглядаючи команди pip, я виявив такий pip showвигляд:

> pip show Django
Name: Django
Version: 1.11
...
Location: /usr/lib/python3.4/site-packages
...

Зверніть увагу, що місцеположення означає "3.4". Я виявив, що python-команда була пов'язана зpython2.7

/usr/bin> ls -l python
lrwxrwxrwx 1 root root 9 Mar 14 15:48 python -> python2.7

Прямо поруч із цим я знайшов посилання під назвою, python3тому я скористався цим. Ви також можете змінити посилання на python3.4. Це і виправить.


1

У моєму випадку це була проблема з відсутнім файлом init .py в модулі, який я хотів імпортувати в середовище Python 2.7.

У Python 3.3+ є непрямі пакети просторів імен, які дозволяють створювати пакунки без init .py-файлу.


1

Якщо інші згадані відповіді не працюють для вас, спробуйте видалити кеш-пам'ять і перевстановіть пакет. Моя машина працює на Ubuntu14.04, і вона знаходилась під ~/.cache/pip. Видалення цієї папки зробило для мене трюк.


1

Крім того , переконайтеся , що ви не плутайте pip3з pip. Я знайшов, що встановлений з ним пакет pipне працює python3і навпаки.


0

Коли ви встановлюєте через easy_installабо pip, це успішно завершується? Що таке повний вихід? Яку установку python ви використовуєте? Можливо, вам доведеться використовувати sudoперед командою установки, якщо ви встановлюєте модулі в системний каталог (можливо, якщо ви використовуєте інсталяцію системного пітона). У вашому запитанні не так багато корисної інформації, але деякі інструменти, які, ймовірно, допоможуть:

  • echo $PYTHONPATHта / або echo $PATH: під час імпорту модулів Python шукає одну з цих змінних середовища (списки каталогів з :обмеженим доступом) для потрібного модуля. Проблеми з імпортом часто пов’язані з відсутністю правого каталогу у цих списках

  • which python, which pipабо which easy_install: вони покажуть розташування кожного виконуваного файлу. Це може допомогти дізнатися.

  • Використовуйте virtualenv , як пропонує @JesseBriggs. Це дуже добре pipдопомагає вам виділити та керувати модулями та середовищем для окремих проектів Python.


0

У мене була така точна проблема, але жодна з вищезгаданих відповідей не спрацювала. Це зводило мене з розуму, поки я не помітив, що sys.path був іншим після того, як я імпортував із батьківського проекту. Виявилося, що я використав importlib для написання невеликої функції, щоб імпортувати файл не в ієрархії проектів. Погана ідея: я забув, що зробив це. Ще гірше, що процес імпорту вимкнувся з sys.path - і залишив його таким чином. Дуже погана ідея.

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


0

У мене була ця проблема з 2.7 і 3.5, встановленими в моїй системі, намагаючись протестувати телеграм-бот з Python-Telegram-Bot .

Я не міг змусити його працювати після встановлення з pip та pip3, з sudo чи без. У мене завжди було:

Traceback (most recent call last):
  File "telegram.py", line 2, in <module>
    from telegram.ext import Updater
  File "$USER/telegram.py", line 2, in <module>
    from telegram.ext import Updater
ImportError: No module named 'telegram.ext'; 'telegram' is not a package

Правильне читання повідомлення про помилку підказує мені, що python шукає у поточному каталозі для telegram.py. І правильно, у мене лежав сценарій під назвою telegram.py, і це завантажувалося python, коли я дзвонив import.

Висновок, переконайтеся, що package.pyу вашому поточному режимі роботи немає під час імпорту. (І уважно прочитайте повідомлення про помилку).


0

У мене були подібні проблеми (у Windows), і першопричиною в моєму випадку було програмне забезпечення ANTIVIRUS ! Він має функцію "Автозахист", яка завершує процес запуску якоюсь віртуальною машиною. Симптоми: pip install somemoduleдобре працює в одному вікні cmd-рядка і import somemoduleвиходить з ладу при виконанні іншого процесу з помилкою

ModuleNotFoundError: No module named 'somemodule'

Сподіваюся, це комусь заощадить час :)


0

Можливо, трохи поза темою, але у мене були проблеми import PyYAML. Вказує, що вам потрібно import yaml. (Гадаю, це класичний rtfm ...)


0

У мене була схожа проблема з використанням Джанго. У моєму випадку я можу імпортувати модуль із оболонки Django, але не з .py, який імпортував модуль.
Проблема полягала в тому, що я запускав сервер Django (отже, виконуючи .py) з іншого virtualenv, з якого був встановлений модуль.

Натомість екземпляр оболонки запускався у правильному virtualenv. Отже, чому це спрацювало.


0

Це працює !!!

Це часто відбувається, коли модуль встановлюється на більш стару версію python або інший каталог, не хвилюйтесь, оскільки рішення просте. - модуль імпорту з каталогу, в якому встановлений модуль. Це можна зробити, спочатку імпортуючи sysмодуль python, а потім імпортуючи із шляху, в якому встановлений модуль

import sys
sys.path.append("directory in which module is installed")

import <module_name>

0

Більшість можливих випадків уже охоплені рішеннями, просто поділившись моїми випадками, мені трапилося, що я встановив пакет в одному середовищі (наприклад X) і імпортував пакунок в іншому середовищі (наприклад Y). Тому завжди переконайтеся, що ви імпортуєте пакунок із середовища, в якому встановили пакунок.


0

Щось для мене працювало:

python -m pip install -user {package name}

Команда не вимагає sudo. Це було протестовано на OSX Mojave.


0

У моєму випадку мені також довелося встановити модуль (и) для суперпользователя.

sudo su
pip install <module>

Мабуть, суперперус не може отримати доступ до звичайних файлів користувачів за певних обставин.


0

Для мене це забезпечувало вирівнювання версії модуля з версією Python, яку я використовував. Я створив зображення на коробці з Python 3.6, а потім ввів зображення Docker, у якого було встановлено 3.7 , а потім стукав головою коли Python сказав мені, що модуль не встановлений ...

36m для Python 3.6 bsonnumpy.cpython-36m-x86_64-linux-gnu.so

37m для Python 3.7 bsonnumpy.cpython-37m-x86_64-linux-gnu.so


pip installверсія, яка відповідає версії Python, яку ви використовуєте. Яку помилку ви отримуєте, і який результатpython --version
Streetter

python --version дає мені: Python 3.7.7, і коли я перевіряю, де встановлений пакет із pip show, ліброза дає; Розташування: /home/ec2-user/anaconda3/lib/python3.7/site-packages як означає, що пакет знаходиться в потрібному місці, але коли я імпортую пакет, дає: назва модуля не працює, я працюю на AWS Sagemaker env Pytorch_p36
Валід Буссета

імовірно, ви хочете використовувати pytorch_p37?
Стрітер

немає pytorch_p37
Валід Буссета

0

Я знаю, що це дуже стара публікація, але для мене у мене виникла проблема із встановленим 32-бітовим пітоном та 64-бітовим пітоном. Як тільки я видалив 32-бітний пітон, все працювало як слід.


0

Я вирішив свою проблему, що ті самі бібліотеки працювали чудово в одному проекті (A), але імпорт цих самих бібліотек в інший проект (B) спричинив помилку. Я використовую Pycharm як IDE в ОС Windows. Отже, спробувавши багато потенційних рішень і не вдалося вирішити проблему, я зробив ці дві речі (видалив папку "Venv" та переконфігурував інтерпретатора):

У проекті B (В) була папка з назвою ("venv"), що знаходиться у Зовнішніх бібліотеках /. Я видалив цю папку.

2-крок 1 (видалення папки "venv") викликає помилку в конфігурації інтерпретатора Python, а вгорі екрану з'являється повідомлення із записом "Недійсний інтерпретатор пітона, обраний для проекту" та "Налаштувати інтерпретатор пітона", виберіть це посилання та його відкриває нове вікно. Там у спадному списку "Перекладач проектів" є червона кольорова лінія, що показує попередній недійсний перекладач. Тепер відкрийте цей список і виберіть інтерпретатора Python (у моєму випадку це Python 3.7). Натисніть «Застосувати» та «ОК» внизу, і ви добре підете.

Примітка. Можливо, це було проблемою, коли віртуальне середовище мого проекту (B) не розпізнавало вже встановлені та працюючі бібліотеки.


0

Якщо ви використовуєте віртуальне середовище, використовуйте pipenv install <module name>замість цьогоpip install <module name>

Працювали для мене.


pipenv не знайдено
Валід Буссета

0

Була і ця проблема. Пакет був встановлений на Python 3.8.0, але VS Code запускав мій сценарій за допомогою старішої версії (3.4)

виправити в терміналі:

py.py

Переконайтеся, що ви встановлюєте пакет у правій версії Python


0

Як сьогодні зробив друг для мене, ось що мені допомогло (я використовую Windows):

Натисніть «Налаштування» -> «Проект» -> «Інтерпретатор проекту». Тут, у вікні праворуч, ліворуч розміщено рядок із заголовком "Перекладач проекту". Клацніть цей рядок, і він відкриє кілька додаткових рядків.

Тепер натисніть рядок "Показати все". Відкриється вікно. У цьому вікні натисніть маленький знак "+" у верхньому правому куті.

Відкриється нове вікно. Ліворуч - 4 вкладки, натисніть на саму верхню, на якій написано "Virtualenv Environment". Тепер у вікні праворуч позначте параметр «Існуюче середовище». Рядок "Перекладач" стане добре видимим. Натисніть кнопку "..." праворуч від рядка.

Тепер відкриється вікно перегляду. Перейдіть до каталогу, в який ви встановили сам Python . Не той, з PyCharm. Потрапивши туди, виберіть файл "python.exe" і натисніть кнопку ОК (вікно зникне).

Знову натисніть OK (це вікно також зникне).

Тепер у цьому вікні переконайтеся, що новий рядок, який ви створили, позначений і знову натисніть кнопку ОК.

Тепер усі встановлені пакети повинні бути видимими в інтерпретаторі проекту і читатись вашою програмою.


0

Найпростіше рішення, яке працювало для мене, і я не бачу згадуваних у цій темі:

У мене встановлено кілька версій Python, але я намагався використовувати Python3.7 - тому мені довелося використовувати:

sudo pip3.7 install <package>

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