pip не знает об установленных пакетах apt-get

На довольно свежей Ubuntu 16.04 я устанавливаю ipython с pip, как пользовательскую установку. Сам пип был установлен с python-pip Пакет Ubuntu (8.1.1), а также некоторые зависимости, такие как pygments или setuptools (20.7.0).

Мой вопрос: это нормально, что при выполнении пользовательской установки с помощью pip установленные пакеты apt-get не обнаруживаются? Это известная ошибка?

Это команда, которую я запускаю (как пользователь, а не как root):

$ pip install ipython

→ Я получаю загрузку многих пакетов из PyPI, включая setuptool (27.3.0) и Pygments (2.1.3). Я не думаю, что это проблема версии, так как ipython требует setuptools>=18.5 только. Кстати, я также получаю жалобу, что pip должен быть обновлен до последней версии (8.1.2).

Еще более интригующе, когда я снова запускаю ту же команду, я получаю тот же процесс установки (единственное отличие: колеса кэшируются). Вместо этого я бы ожидал, что pip сообщит мне, что ipython уже установлен.

Обратите внимание, что нет никаких сомнений, что ipython (версия 5.1.0) действительно установлен в моем ~/.local каталог, и он работает хорошо (единственное, что я должен был сделать, это добавить ~/.local/bin к PATH переменная в ~/.bashrc как уже упоминалось в отдельном вопросе).

Мне кажется, что что-то не так с тем, как pip обнаруживает установленные пакеты apt-get, но я не могу понять, что именно. Я что-то упускаю из виду?

Если это может помочь в диагностике, это путь к модулю Python (modelica - это имя пользователя):

python -c "import sys; print sys.path"
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/modelica/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/omniORB/COS', '/usr/lib/python2.7/dist-packages/gtk-2.0']

1 ответ

ПРИМЕЧАНИЕ: Как и OP, я использую Ubuntu 16.04, Python 2.7 и Pip 8.1.1.

это нормально, что при пользовательской установке с помощью pip установленные пакеты apt-get не обнаруживаются? Это известная ошибка?

Я просто погрузился в код пипса и обнаружил, что пипс list Команда фильтрует список пакетов, предоставляемых pkg_resources.WorkingSet (), который, в свою очередь, получает свои записи от sys.path, Результатом является то, что pip --list (без параметров) также перечислит системные пакеты, установленные APT. Таким образом, в некотором смысле, Пип обнаруживает их. Это, однако, не означает, что pip может управлять этими пакетами, подобно тому, как APT, RPM и другие системы управления пакетами не совместимы.

Pip не может управлять пакетами DEB, установленными с APT, даже если они относятся к Python, потому что существует достаточно различий в том, как работает каждый менеджер пакетов, чтобы предотвратить это; Я не знаю всех их, но одно, что сбивает с толку, это то, что pip устанавливается глобально /usr/lib/pythonX.Y/site-packages или же /usr/local/lib/pythonX.Y/dist-packages (в зависимости от версии) и локально ~/.local/lib/pythonX.Y/site-packages в то время как пакеты DEB устанавливаются глобально в /usr/lib/pythonX.Y/dist-packages,

Эта странность связана с дизайнерским решением разработчиков Debian, чтобы точно избежать конфликтов между пакетами, предоставленными ими и установленными с использованием их системы упаковки, и пакетами, полученными другими способами ( этот ответ о переполнении стека указал мне верное направление).

Так что нет, это не ошибка, что pip позволяет устанавливать пакеты в ~/.local/lib/pythonX.Y/site-packages даже если пакет уже установлен в /usr/lib/pythonX.Y/dist-packages,


Давайте посмотрим на вашем примере с ipython. Я также установил его ранее с APT:

Пакет DEB

$ dpkg --get-selection | grep ipython
установка ipython

$ dpkg -s ipython | версия grep
Версия: 2.4.1-1

$ dpkg-query -L ipython
(...)
/usr/lib/python2.7/dist-packages
(...)
/ USR / бен / IPython
(...)

Пип Пакет

$ pip show -f ipython
(...)
Имя: ipython
Версия: 5.3.0
(...)
Установщик: pip
(..)
Расположение: /usr/local/lib/python2.7/dist-packages
файлы:../../../bin/ipython

Замечания: ../../../bin/ipython в конечном итоге /usr/local/bin/ipython ,

Как и ожидалось, whereis дает мне оба экземпляра IPython:

$ whereis -b ipython
ipython: /usr/bin/ipython /usr/local/bin/ipython

И я все еще могу получить третий IPython на ~/.local!


Еще более интригующе, когда я снова запускаю ту же команду, я получаю тот же процесс установки (единственное отличие: колеса кэшируются). Вместо этого я бы ожидал, что pip сообщит мне, что ipython уже установлен.

Это на самом деле кажется странным, и я все еще в этом разбираюсь, но вот что я наблюдал до сих пор: когда пакет уже был установлен pip локально, он, кажется, устанавливается каждый раз (всегда выдается "Успешно установлен {пакет}"), но на самом деле кажется, что это просто изменяет пакеты dist-info. Например, я попытался установить lxml локально (либо с pip install lxml или же pip install --user lxml) Пару раз:

Сравните временную метку:

myusr @ myhost: ~ $ ls -al.local / lib / python2.7 / site-packages | grep lxml
drwxrwxr-x 5 myusr mygroup 4096 фев 20 15:01 lxml
drwxrwxr-x  2 myusr mygroup  4096 фев 20 15:01 lxml-3.7.3.dist-info

(Это после того, как я впервые установил lxml.)

С:

myusr @ myhost: ~ $ ls -al.local / lib / python2.7 / site-packages | grep lxml
drwxrwxr-x 5 myusr mygroup 4096 фев 20 15:01 lxml
drwxrwxr-x  2 myusr mygroup  4096 фев 20 15:03 lxml-3.7.3.dist-info

(Это после последней "установки" lxml.)

Однако, когда кто-то пытается установить пакет глобально, pip показывает сообщение:

Requirement already satisfied (use --upgrade to upgrade): ipython in /usr/local/lib/python2.7/dist-packages

Пытаться

python3 -m pip install ipython

Для меня работа

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