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