apt-get install python-xxx vs pip install

8

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

  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 против 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, каков наилучший способ проверить наличие дубликатов и очистить их? Я предполагаю, что небезопасно использовать скрипт, чтобы удалить все и переустановить pip?

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

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

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

  • В этом случае вы можете только обновить, то есть установить с флагом -U.

  • Однако, когда вы попытаетесь pip install -U xyzустановить пакет, установленный с помощью sudo apt-get, вы получите ошибку разрешения, потому что apt-get был установлен в / usr /, и вам нужен root-доступ для записи туда.

  • Так что 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 против 2.3.8)

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

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

NB. Кажется, очень важно получить новый пункт из пункта (очень мета)

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
меморандум
источник