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']
Я надеюсь, что это поможет кому-то однажды...