apt-get install python-xxx vs pip install


8

Я все ще намагаюся зрозуміти цю проблему, яку я маю, і прочитав безліч публікацій щодо sudo apt-get install python-XXXvs pip install, і я розумію суть її (apt-get - це пакет репо, яким керує зовсім інша група людей, щоб піп, авто -оновлення разом із усім іншим, коли є оновлення, воно є двійковим тощо). Однак є кілька конкретних речей, на які я не розумію і на які не змогла знайти відповіді:

  1. Якщо я з будь-якої причини спочатку встановлю пакет, наприклад, нуме, з sudo apt-get install numpy, а потім - пізніше pip install numpy. Що сталося? nummy знову встановлено в іншому місці з іншою версією (наприклад, у .local / lib), тож тепер у мене є дві незалежні версії? Який використовується при імпорті? (якщо я правильно зрозумів, це роздільно, і apt-get є системним, але я бачив суперечливі відповіді на це питання, наприклад, тут )

  2. Я помітив, що багато пакетів apt-get є досить старими порівняно з pip. наприклад, під час написання ipython 2.3.0 проти 4.0.3, numpy 1.10.2 проти 1.10.4, шпидер 2.3.5 проти 2.3.8. Чи є якась перевага, яку спочатку sudo apt-get installслід pip install? чи це просто нерозумно?

  3. Я помітив, що мій піп був 1,5,6 - це поточний останній, якщо ви робите sudo apt-get install python-pip. тоді як на піп це 8.0.2! Я вважаю, що це викликає у мене проблеми, оскільки зі старою версією ви можете встановлювати один і той же пакет знову і знову, і він не попереджає. І якимось чином це не пише старого. Я зрозумів це, тому що можу продовжувати видаляти один і той же пакет (наприклад, numpy), і він все ще є завжди, коли я це роблю pip show numpy. І як не дивно, завжди показується однакова папка (.local /), але з різними версіями: S Отже, у мене є два питання, пов’язані з цим:

    а. який найкращий спосіб встановити pip? Я в даний час схиляється до sudo apt-get install python-pip, pip install pip, sudo apt-get purge python-pip. Це розумно? Мені це здається трохи смішним.

    б. тепер, коли я знаю, що багато моїх пакунків переплутано з повторюваними встановленнями, ймовірно, тому, що деякі були встановлені з apt-get, а потім пізніше кілька разів з pip 1.5.6, який найкращий спосіб перевірити дублікати та очистити його? Я здогадуюсь, що не безпечно використовувати скрипт, щоб видалити все та перевстановити піп.

PS Я не був впевнений, чи варто це ставити як нове запитання або як відповідь на мою первісну проблему. Оскільки це питання є набагато більш стислим та загальним, я вважав, що краще було б окремо. Вибачте, якщо помилився.


Можливий дублікат apt get install vs pip install
muru

Я фактично посилаюсь на цю публікацію у своєму питанні, вона була дуже корисною, щоб очистити багато моєї плутанини, але вона не відповідає на мої запитання вище (принаймні, я не міг її побачити)
записка

О, у вашому іншому питанні. Я просто переглянув список пов’язаних публікацій і не побачив його там.
муру

Відповіді:


8

Щодо архівів, після багатьох спроб і помилок це те, що я знайшов (заднім часом деякі біти мають сенс, а інші досить заплутано).

  • Якщо ви sudo apt-get install python-xyz, пакет буде відображатися в pip list. Звичайно, ви можете імпортувати його в python, але він не відображається у pip.get_installed_distributions (). (Очевидно, що навпаки не вірно. Тобто, якщо ви pip install xyzце зробите, це не відображатиметься у вашому підході / синаптиці)

  • Після того, sudo apt-get install python-xyzяк ви зробите pip install xyzте, що відбувається, залежить від вашої версії файлу.

OLD v1.5.6 (поточна версія доставки на Ubuntu PPA):

  • Ця версія pip (1.5.6) просто встановить нову копію xyz в іншому місці. У вас виходить кілька копій, і це спричиняє величезний безлад. наприклад:

    • numpy від apt-get становить 1,8,2 в /usr/local/lib/python2.7/dist-packages
    • numpy від pip - 1.10.4 в ~ / .local / lib / python2.7 / site-пакетах
  • Якщо я pip install numpyще раз, він завантажує та встановлює його знову. Таким чином, ви можете отримати багато різних версій, до яких ви не можете отримати доступ. Я можу робити pip install numpy5 разів, а потім можу робити pip uninstall numpy 5xрази! Очевидно, ви можете звернути увагу, щоб цього не робити, але іноді сценарії встановлення іншого програмного забезпечення трохи недбалі і можуть зіпсувати справи. Неймовірно, що Ubuntu офіційно постачає цю версію піп.

НОВОГО v8.0.2 (поточна версія у самому pip):

  • новіші версії pip (наприклад, 8.0.2, які є на pip) відмовляться від встановлення того самого пакету, кажучи, що вимога вже виконана. Тому ви не можете встановити нову версію. Це хороша поведінка (детальніше про отримання цієї версії файлу пізніше).

  • У цьому випадку ви можете лише оновити, тобто встановити прапор -U.

  • Однак, коли ви спробуєте pip install -U xyzвстановити пакет, встановлений з sudo apt-get, ви отримаєте помилку дозволів, оскільки apt-get був встановлений в / usr / і вам потрібен кореневий доступ, щоб писати там.

  • Тож AFAIK вам не залишається іншого вибору, sudo pip install -U xyzяк мати можливість оновити його. У цьому випадку pip встановлює останній пакет там же, де написав його sudo apt-get. наприклад, у моєму випадку /usr/local/lib/python2.7/dist-packages. Це добре.

  • Варто також зазначити, що пакети на apt часто досить старі, ніж пакети на pip (наприклад, numpy v1.8.2 проти 1.10.4, scipy 0.14.1 проти 0.17.0, ipython 2.3 проти 4.0.3, spyder 2.3.5 vs 2.3.8)

Тож мої нинішні думки полягають у тому, щоб здобути великі речі sudo apt-get, наприклад, sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy pythoшпигун з носом

а потім оновити їх (або принаймні деякі з них) за допомогою sudo pip install -U.

NB: Мабуть, дуже важливо отримати новий файл від pip (дуже мета)

sudo apt-get install python-pip
sudo pip install -U pip

PS Я знаю virtualenv, але зараз у мене немає потреби в цьому. Мені потрібно лише одне середовище розвитку.

Ось невеликий скрипт для скидання списку пакунків, версії та шляху (але працює лише на встановлених на pip модулях, а не на тих, що входять до apt-get)

import pip
pp = pip.get_installed_distributions()
for p in sorted([p.location+"\t"+p.project_name+" ("+p.version+")" for p in pp]):
    print p
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.