apt-get install python-xxx vs pip install

7

Я все еще пытаюсь понять эту проблему , с которой я сталкиваюсь и прочитали тонну сообщений, касающихся sudo apt-get install python-XXX vs pip install , и я понимаю его суть (apt-get - это пакетное репо, которым управляет совершенно другая группа людей, пип, автоматическое обновление вместе со всем остальным, когда есть доступное обновление, оно является двоичным и т. д.). Однако есть несколько конкретных вещей, которые я не понимаю и не могу найти ответы на:

  1. Если я по какой-либо причине сначала установлю пакет, например. numpy, с sudo apt-get install numpy , а затем я позже pip install numpy . Что происходит? numpy установлен снова в другом месте с другой версией (например, в .local / lib), так что теперь у меня есть две независимые версии? Какой из них используется при импорте? (если я правильно понял, что он отдельный, а apt-get - системный, но я видел противоречивые ответы на этот вопрос, например здесь )

  2. Я заметил, что многие пакеты на apt-get довольно старые по сравнению с pip. например во время написания ipython 2.3.0 против 4.0.3, numpy 1.10.2 vs 1.10.4, spyder 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, что лучше всего проверить на наличие дубликатов и очистить его? Я предполагаю, что небезопасно использовать скрипт для удаления всех программ и переустановки?

P.S. Я не был уверен, должен ли я опубликовать это как новый вопрос или как ответ на мою оригинальную проблему. Поскольку этот вопрос намного более краткий и общий, я чувствовал, что это будет лучше разделить. Извиняюсь, если я ошибался.

    
задан memo 26.01.2016 в 13:57
источник

1 ответ

7

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

  • Если вы sudo apt-get install python-xyz , пакет появится в pip list . Конечно, вы можете импортировать его в python, но он не отображается в pip.get_installed_distributions (). (Очевидно, что противоположное значение не истинно, т. Е. Если вы выполняете pip install xyz , оно не будет отображаться в вашем apt / synaptic)

  • После 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 from pip - 1.10.4 в ~ / .local / lib / python2.7 / site-packages
  • Если я снова сделаю pip install numpy , он снова загрузит и установит его. Таким образом, вы можете получить множество разных версий, к которым вы не можете получить доступ. Я могу сделать pip install numpy 5x раз, а затем я могу сделать pip uninstall numpy 5x раз! Очевидно, вы можете обратить внимание на это, но иногда скрипты установки другого программного обеспечения немного небрежны и могут испортить ситуацию. Невероятно, что Ubuntu официально отправляет эту версию протокола.

NEW v8.0.2 (текущая версия на самом пипе):

  • более новые версии pip (например, 8.0.2, которые находятся на пипе) откажутся установить тот же пакет, который уже удовлетворен. Поэтому вы не можете установить новую версию. Это хорошее поведение (подробнее о получении этой версии протокола позже).

  • В этом случае вы можете только обновить, т. е. установить флаг -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 vs 1.10.4, scipy 0.14.1 vs 0.17.0, ipython 2.3 vs 4.0.3 , spyder 2.3.5 против 2.3.8)

Итак, мои текущие мысли - получить большие вещи с sudo apt-get , например. sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy pytho n-spyder

, а затем обновите их (или, по крайней мере, некоторые из них) с помощью sudo pip install -U .

NB Кажется довольно важным получить новый пипс от pip (очень мета)

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

P.S. Я знаю об виртуальных, но мне не нужно это прямо сейчас. Мне нужна только одна среда разработки.

И вот небольшой скрипт для дампа списка пакетов, версии и пути (но работает только с установленными модулями, а не с 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
    
ответ дан memo 26.01.2016 в 19:11
источник