Python 3 не может импортировать сторонние пакеты

У меня есть версия Python 3.5.2, и у меня есть pip3, поэтому я сделал

sudo pip3 install pyqt5

Это было установлено в /usr/local/lib/python3.5/dist-packages

Однако, когда я вхожу в мой интерпретатор Python 3 и введите

import PyQt5

выдает ошибку, что не может найти модуль с именем PyQt5.

Поэтому я попытался добавить путь /usr/local/lib/python3.5/dist-packages к PYTHONPATH, выполнив

export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.5/dist-packages

но это ничего не исправило. Как заставить Python 3.5.2 обнаруживать PyQt5?

1 ответ

Благодаря Джорджу я потихоньку добрался до ответа. Корень проблемы заключается в том, что я установил версию Python 3.5.2 из источника, а не из менеджера пакетов Ubuntu aptitude.

По сути, если Python установлен из исходного кода, то для поиска сторонних пакетов он использует /usr/local/lib/python3.5/site-packages, но если он был установлен с помощью aptто Python заглядывает в /usr/local/lib/python3.5/dist-packages, Это сделано для того, чтобы несколько версий Python не запутались. Вот еще один вопрос, который объясняет: в чем разница между dist-пакетами и site-пакетами?,

Решение:

Моя установка Python3 проверяла пакеты сайта и игнорировала dist-пакеты, поэтому я добавил файл пути, чтобы он также смотрел внутри dist-пакетов.

cd /usr/local/lib/python3.5/site-packages
sudo vim dist-packages.pth
(Press i to go into insert mode inside Vim)
../dist-packages
:x (and Press Enter/Return)

Теперь, когда Python смотрит внутрь /site-packagesнаходит dist-packages.pth что заставляет его войти в /dist-packages,

Другое решение:

У кого-то была проблема, прямо противоположная моей, где их установка Python смотрела только внутрь /dist-packagesпоэтому они использовали тот же метод, что и выше, за исключением того, что вместо dist-packages.pth файл (содержащий ../dist-packages) внутри /site-packagesони сделали site-packages.pth файл (содержащий ../site-packages внутри /dist-packages,

Проверьте, сработало ли это:

Самый простой способ проверить, сработало ли это, - зайти в ваш интерпретатор Python и напечатать sys.path. Теперь он должен содержать оба пути пакета:

charliebrown@playground:/usr/local/lib/python3.5/site-packages$ python3
Python 3.5.2 (default, Nov 19 2016, 02:36:25) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys; print(sys.path)
['', '/usr/local/lib/python35.zip', '/usr/local/lib/python3.5',     '/usr/local/lib/python3.5/plat-linux', '/usr/local/lib/python3.5/lib-dynload', 
'/usr/local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages']

Я надеюсь, что это поможет кому-то однажды...

Другие вопросы по тегам