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


157

После установки Mechanize я не могу импортировать его.

Я пробовал установить из 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 - добавил эту информацию в исходный пост
roy

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

Ответы:


103

В моем случае это проблема с разрешением. Пакет каким-то образом был установлен только с правами root rw, другой пользователь просто не может к нему rw!


28
Это случилось со мной, просто бегом sudo pip install .... Простое исправление:sudo chmod -R ugo+rX /lib/python2.7/site-packages/
jozxyqk

3
Я сталкивался с этим много раз, и я думаю, что только что обнаружил причину: umask передается через sudo, поэтому, если ваша личная umask жесткая и вы используете sudo для установки, файлы и каталоги будут чрезмерно ограничены. Если вы сначала просто выполните su, а затем выполните установку из полной корневой оболочки, получившуюся установку можно будет использовать (по крайней мере, для меня). Это было для pip, но может относиться и к apt-get. Если другие подтвердят эту причину, возможно, потребуется изменить ответ соответствующим образом?
Brandyn

Добавление к комментарию jozxyqk: убедитесь, что вы выбрали правильный каталог, выполнив $ pip show <package_name>
Федерико

3
Мне то же. Я работаю с Python 3.6 на Mac, так sudo chmod 777 /usr/local/lib/python3.6/site-packagesчто трюк сделал
Антонио Серрано

9
sudo 777 - всегда очень плохая идея
Маркс

89

У меня была та же проблема: скрипт с import coloramaбросал и ImportError, но sudo pip install coloramaговорил мне, что «пакет уже установлен».

Моя ошибка : запустить пип без Судо : pip install colorama. Затем pip согласился, что его нужно установить, установил его, и мой скрипт запустился.

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

ОБНОВЛЕНИЕ : еще лучше используйте python -m pip install <package>. Преимущество этого заключается в том, что, поскольку вы выполняете конкретную версию python, в которой хотите получить пакет, pip однозначно установит пакет на «правильный» python. Опять же, не используйте sudo в этом случае ... тогда вы получите пакет в нужном месте, но, возможно, с (нежелательными) правами root.


1
в качестве альтернативы вы можете использовать флаг sudo -H
Graydyn Young

21

Это проблема пути Python.

В моем случае у меня установлен 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/

И site-package не находится в пути python, все, что я сделал, это навсегда добавил пакеты сайтов в PYTHONPATH.

  1. Откройте Терминал
  2. Введите open .bash_profile
  3. В появившемся текстовом файле добавьте в конец эту строку:

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

  4. Сохраните файл, перезапустите Терминал, и все готово.

Это сработало для меня, когда Дженкинс работал с селеновым питоном.
edst

Это сработало для меня при запуске сельдерея через супервизор, когда мой сценарий bash вызвал мой сценарий сельдерея; Сценарий сельдерея не смог импортировать уже установленные модули внутри моего пипса. Благодаря тонну.
Шивам Шарма

Примечание. Другая возможность ошибки импорта заключается в том, что на вашем компьютере установлено несколько версий Python. Например, один из системного Python, другой из Miniconda или Anaconda. Поэтому обязательно используйте правильный соответствующий «пункт».
Санчит

9

Механизм импорта Python действительно работает, так что либо:

  1. Ваш PYTHONPATH неправильный,
  2. Ваша библиотека не установлена ​​там, где вы думаете
  3. У вас есть другая библиотека с тем же именем, маскирующая эту

1
В этом случае не может быть варианта 3; это не вызовет ошибку ImportError.
Мартейн Питерс

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

3
Вариант 4: ваш PYTHONPATH правильный, ваша библиотека находится там, где вы этого хотите, у вас нет библиотеки, маскирующей это ... но поскольку вы использовали sudo pip installее, она была установлена ​​с привилегиями root, и во время импорта что-то бомбит из-за отсутствия чтение или запись.
Дэн Х

2
Не совсем правда, @MartijnPieters: если есть импорт формы «из <пакет> импорт <Foo>», и если пакет мешающий не было «Foo», то вы получите сообщение об ошибке импорта для варианта 3.
Dan H

@DanH конечно, но это не та форма, которую использует OP.
Мартин Питерс

9

Я бился головой об этом по монитору до тех пор, пока молодой практикант не сказал мне, что секрет заключается в "установке 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 packagename». Это обеспечило местоположение установленного пакета.

Затем я открыл 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

Надеюсь это поможет.


3

Я новичок в питоне. Я исправил эту проблему, изменив путь интерпретатора проекта.
File -> Settings -> Project -> Project Interpreter


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+ имеет пакеты неявного пространства имен, которые позволяют создавать пакеты без файла инициализации .py.


1

Если другие упомянутые ответы не работают для вас, попробуйте удалить кеш pip и переустановить пакет. Моя машина работает под управлением Ubuntu14.04, и она находилась под ~/.cache/pip. Удаление этой папки помогло мне.


1

Что-то, что сработало для меня, было:

python -m pip install -user {package name}

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


1

Также убедитесь, что вы не перепутали pip3с pip. Я обнаружил, что установленный пакет pipне работает, python3и наоборот.


0

Когда вы устанавливаете через easy_installили pip, она успешно завершается? Что такое полный выход? Какую установку Python вы используете? Вам может потребоваться использовать sudoперед командой установки, если вы устанавливаете модули в системный каталог (возможно, если вы используете системную установку Python). В вашем вопросе не так много полезной информации, но некоторые инструменты, которые, вероятно, помогут, включают:

  • 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), и основной причиной в моем случае было ПО АНТИВИРУСА ! Он имеет функцию «Автоконтроль», которая оборачивает запущенный процесс какой-то виртуальной машиной. Симптомы: pip install somemoduleотлично работает в одном окне cmd-строки и import somemoduleне работает при выполнении из другого процесса с ошибкой

ModuleNotFoundError: No module named 'somemodule'

Надеюсь, это кому-нибудь сэкономит время :)


0

У меня была аналогичная проблема с использованием Django. В моем случае я мог импортировать модуль из оболочки Django, но не из файла .py, который импортировал модуль.
Проблема заключалась в том, что я запускал сервер Django (следовательно, выполнял .py) из другого виртуального сервера, из которого был установлен модуль.

Вместо этого экземпляр оболочки запускался в правильном virtualenv. Следовательно, почему это сработало.


0

Большинство возможных случаев уже были рассмотрены в решениях, просто поделившись моим случаем, со мной случилось, что я установил пакет в одной среде (например, X), и я импортировал пакет в другую среду (например Y). Поэтому всегда убедитесь, что вы импортируете пакет из среды, в которой вы его установили.


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 librosa дает; Расположение: /home/ec2-user/anaconda3/lib/python3.7/site-packages, как это означает, что пакет находится в нужном месте, но когда я импортирую пакет, выдает: нет имени модуля Я работаю над окружением AWS Sagemaker Pytorch_p36
Валид Буссета

предположительно вы хотите использовать pytorch_p37?
streetter

pytorch_p37 нет
Валид Бусета

0

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


0

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

1-В проекте (B) была папка с именем ("venv"), расположенная во внешних библиотеках /. Я удалил эту папку.

2-шаг 1 (удаление папки «venv») вызывает ошибку в конфигурации интерпретатора Python, и в верхней части экрана отображается сообщение «Недопустимый интерпретатор Python, выбранный для проекта» и «Настроить интерпретатор Python», выберите эту ссылку, и она открывает новое окно. В раскрывающемся списке «Project Interpreter» есть красная линия, показывающая предыдущий недопустимый интерпретатор. Теперь откройте этот список и выберите Python Interpreter (в моем случае это Python 3.7). Нажмите «Применить» и «ОК» внизу, и все готово.

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


0

Если вы используете виртуальную среду, используйте pipenv install <module name>вместоpip install <module name>

Работал у меня.


pipenv not found
Валид Бусета

0

Была и эта проблема ... пакет был установлен на Python 3.8.0, но VS Code запускал мой скрипт с использованием более старой версии (3.4)

исправить в терминале:

py .py

Убедитесь, что вы устанавливаете пакет в правильную версию Python.


0

Как мой друг сделал для меня сегодня, вот что мне помогло (я использую Windows):

Нажмите «Настройка» -> «Проект» -> «Интерпретатор проекта». Здесь, в окне справа, слева есть строка с заголовком «Project Interpreter». Щелкните эту строку, и откроется несколько дополнительных строк.

Теперь нажмите строку «Показать все». Откроется окно. В этом окне нажмите маленький значок «+» в правом верхнем углу.

Откроется новое окно. Слева есть 4 вкладки, нажмите самую верхнюю, на которой написано «Virtualenv Environment». Теперь в окне справа отметьте опцию «Существующая среда». Строка «Переводчик» станет хорошо видна. Нажмите кнопку "..." справа от строки.

Теперь откроется окно просмотра. Перейдите в каталог, в который вы установили сам Python. . Не тот, что с PyCharm. Когда вы попадете туда, выберите файл «python.exe» и нажмите ОК (окно исчезнет).

Снова нажмите ОК (это окно тоже исчезнет).

Теперь в этом окне убедитесь, что созданная вами новая строка отмечена, и снова нажмите OK.

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


0

Самое простое решение, которое сработало для меня, о котором я не упоминал в этой теме:

У меня установлено несколько версий Python, но я пытался использовать Python3.7, поэтому мне пришлось использовать:

sudo pip3.7 install <package>


-1

Может быть, немного не по теме, но у меня были проблемы import PyYAML. Указывает на то, что вам нужно import yaml. (думаю, это классический rtfm ...)


-1

Это работает!!!

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

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

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