Чи перезаписує пакети pip, встановлені apt-get?


9

Що станеться, якщо я випадково pip installотримав пакет, який я вже встановив apt-getзаздалегідь? Чи просто я можу використовувати останню версію (тобто, ймовірно, ту, яку я встановив pip)? Що відбувається навпаки?

Примітка. Я не використовую Python у віртуальному середовищі (просто тому, що я не знаю, навіщо мені це - я використовую Python як інструмент аналізу даних і в основному намагаюся використовувати останню версію всього).


Якщо я не помиляюся, ви не встановлюєте ті самі пакунки, використовуючи apt-getіpip
Lucio

Corerct, pipвстановлює їх у /usr/localпідкаталогах за замовчуванням або будь-який інший каталог, якщо ви хочете.
Тимо

3
Але що станеться, наприклад, якщо я спершу перейду apt-get install python-pandasза ним pip install pandas, чи навпаки? Як моя глобальна установка python знає, яку з обох версій використовувати?
Фред S

1
@FredS: Запустіть таку команду в терміналі, Python шукатиме модуль у такому конкретному порядку:python -c "import sys; print sys.path"
Тимо

Відповіді:


3

Як згадував @Timo у своєму коментарі, python -c "import sys; print sys.path"дасть вам шлях завантаження модуля Python для встановлення Python. На відносно свіжому встановленні 16.04 є три примітки (серед 10 загальних, які були у моїх):

  • '' (каталог програми)
  • '/usr/local/lib/python2.7/dist-packages' (де піп встановлює модулі)
  • '/usr/lib/python2.7/dist-packages' (де вдало встановлюють модулі)

Однак, найважливіше зазначити, що "/usr/local/lib/python2.7/dist-packages" є вищим за перевагу, ніж "/usr/lib/python2.7/dist-packages".

Якщо ви спочатку встановите пакет Python через apt (-get), він встановиться у '/usr/lib/python2.7/dist-packages'. Якщо пізніше ви спробуєте використати pip для встановлення модуля, pip спочатку видасть попередження про те, що залежність вже досягнуто, а потім вийдете; додавання прапора --upgrade змусить pip встановити, встановивши модуль у '/usr/local/lib/python2.7/dist-packages'. (Зверніть увагу на висновок , який також говорить про те , що версія в «/usr/lib/python2.7/dist-packages» не видаляється) Ви можете перевірити , що піп-встановлена версія є один використовується, використовуючи наступне: python -c "import MODULE; print MODULE.__file__".

Таким чином, це показує, що пакети, встановлені через pip, матимуть перевагу над встановленими системою пакунками, але не замінять нічого встановленого з apt (-get).


1

Щоб додати до @Bryan Wyatt, здається, що бажано (і призначено), щоб встановлені / оновлені PIP елементи мали перевагу над (можливо, старшими) встановленими пакетами APT. У моїй системі були змінені влучні та піп-контури. Це має бути (ігнорування інших записів):

  • '/usr/local/lib/python2.7/dist-packages' (де піп встановлює модулі)
  • '/usr/lib/python2.7/dist-packages' (де вдало встановлюють модулі)

Однак через якісь невідомі мені дії, які я мав здійснити, ці шляхи з'явились у зворотному порядку для мене (ігноруючи інші записи):

  • '/usr/lib/python2.7/dist-packages' (де вдало встановлюють модулі)
  • '/usr/local/lib/python2.7/dist-packages' (де піп встановлює модулі)

Виявляється, що - то я додається /usr/lib/python2.7/dist-packagesдо /usr/local/lib/python2.7/dist-packages/easy-install.pth. Просто вилучення рядка з easy-install.pthвиправленого для мене непорозуміння. /usr/lib/python2.7/dist-packagesвсе ще на моєму шляху, оскільки він додається на більш пізньому етапі в іншому місці.

Як бічна примітка, pprint відобразить ваш шлях приємніше ... тобто:

$ python -c "import sys; import pprint; pprint.pprint(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',
 '/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/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.