apt-get install vs pip install

103

Я немного запутался в тех случаях, когда вышеуказанные команды должны использоваться при загрузке пакетов Python. Я пытался скачать пакет с именем pyudev в соответствии с ответом на этот вопрос . Я выполнил эту команду:

sudo pip install python-pyudev

но получил следующее сообщение:

Downloading/unpacking python-pyudev

  Could not find any downloads that satisfy the requirement python-pyudev
Cleaning up...
No distributions at all found for python-pyudev
Storing complete log in /home/vineet/.pip/pip.log

Однако следующее работало нормально:

sudo apt-get install python-pyudev

Когда apt-getпредполагается использовать пакеты для установки и когда python-pip?

Винеет Каушик
источник
2
pipиспользуется только для установки пакетов Python, но apt-getиспользуется для установки всех пакетов.
Авинаш Радж
3
хорошо .. так почему pip не смог установить python-pyudev?
Винеет Каушик
см. stackoverflow.com/questions/6874527/…
Авинаш Радж

Ответы:

100

PyPI - это индекс пакета Python - хранилище модулей Python.

pipиспользуется для загрузки и установки пакетов непосредственно из PyPI. PyPI поддерживается Python Software Foundation . Это специализированный менеджер пакетов, который работает только с пакетами Python.

apt-get используется для загрузки и установки пакетов из репозиториев Ubuntu, которые размещаются в Canonical.

Некоторые из различий между установкой пакетов Python из apt-getи pipзаключаются в следующем:

  • Canonical предоставляет пакеты только для выбранных модулей Python. Принимая во внимание, что PyPI содержит гораздо более широкий спектр модулей Python. Итак, есть много модулей Python, которые вы не сможете установить с помощью apt-get.

  • Canonical содержит только одну версию любого пакета (как правило, самую последнюю или выпущенную в недавнем прошлом). Итак, с помощью apt-getмы не можем определиться с версией python-пакета, который нам нужен. pipпомогает нам в этой ситуации. Мы можем установить любую версию пакета, ранее загруженную в PyPI. Это очень полезно в случае конфликта зависимостей.

  • apt-getустанавливает модули Python в общесистемном месте. Мы не можем просто установить модули в наш проект virtualenv . pipрешает эту проблему для нас. Если мы используем pipпосле активации virtualenv, он достаточно умен, чтобы устанавливать только модули в нашем проекте virtualenv. Как упоминалось в предыдущем пункте, если в общесистемном расположении уже установлена ​​версия определенного пакета python, а для одного из наших проектов требуется более старая версия того же пакета python, в таких ситуациях мы можем использовать virtualenv и pip для установки. эта старая версия пакета Python без каких-либо конфликтов.

  • Как @Radu Rădeanu отметил в этом ответе , не было бы вообще быть разница в названиях пакетов , а также. Canonical обычно называет пакеты Python 2 как python-<package_name>и пакеты Python 3 как python3-<package_name>. Принимая во внимание, pipчто, как правило, нам просто нужно использовать <package_name>как пакеты Python 2, так и пакеты Python3.

Какой из них вы должны использовать:

Оба apt-getи pipявляются зрелыми менеджерами пакетов, которые автоматически устанавливают любые другие зависимости пакетов во время установки. Вы можете использовать любого, как вам нравится. Однако, если вам нужно установить определенную версию пакета python, или установить пакет в virtualenv, или установить пакет, который размещен только на PyPI; только pipпоможет вам решить эту проблему. В противном случае, если вы не возражаете против установки пакетов в общесистемном расположении, не имеет значения, используете ли вы apt-getили pip.

Адитья
источник
5
Кроме того, вы должны попытаться использовать один или другой , а не оба pipи apt-getодновременно.
earthmeLon
3
Рано или поздно может понадобиться пакет или его версия, которая не предоставляется apt-get. Поскольку использование обоих apt-getи pipможет привести к конфликтам, должен ли совет всегда использовать pipпакеты, поддерживаемые pip?
Абхишек Ананд
2
@Abhishek, мой предпочтительный метод - всегда использовать Python через virtualenv .. Так что да, я предпочитаю использовать pip, а не apt ..
Aditya
Это открывает свою собственную банку с червями в определенных сценариях. Допустим, вы установили большинство ваших пакетов sudo pipбез, virtualenvпотому что большинству ваших проектов требовалась одна и та же среда (но более обширная, чем та, которая предоставляется при чистой установке Ubuntu). Затем , когда вы делаете обновление системы и Ubuntu решает обновить Python до новой версии (например , с zestyк artful- Python 3.5 до 3.6), все ваших семечковых установленных пакетов в /usrоставлены позади и pip.get_installed_distributions()производит пустой список.
z33k
Использование pip в глобальном контексте совершенно неправильно и не должно использоваться, потому что это испортит установку системного python. pip и apt-get совершенно разные вещи, и сравнивать их неправильно. Попробуйте установить модуль python, который зависит от других не-python-библиотек, и вы быстро поймете, почему вам может понадобиться apt-get.
Местия
21

Как сказал @AvinashRaj в своем комментарии , pipон используется только для установки пакетов python, но apt-getиспользуется для установки пакетов, созданных на любом языке программирования.

Ваша основная проблема - найти правильное имя пакета в обоих случаях:

pip search pyudev

даст вам правильное имя для пакета, который вы хотите установить, используя pip install, как

apt-cache search pyudev

даст вам правильное имя для пакета, который вы хотите установить, используя apt-get install:

radu@Radu: ~ $ pip search pyudev
pyudev                    - A libudev binding
radu@Radu: ~ $ apt-cache search pyudev
python-pyudev - Python bindings for libudev
python3-pyudev - Python3 bindings for libudev

Итак, в заключение, корреспондент sudo apt-get install python-pyudevесть sudo pip install pyudev, а не sudo pip install python-pyudev.

Теперь от вас зависит, что вы хотите выбрать, когда хотите установить пакет Python: pipили apt-get. Посмотрите, например, эти вопросы и ответы о разнице в установке пакета с использованием pipи apt-get.

Раду Рэдяну
источник
2

Мой предпочтительный способ - всегда использовать, aptи только в том случае, если модуль еще не доступен для использования в репозитории Debian / Ubuntu pip, но только в пользовательском контексте - --userflag. В pipлюбом случае, используя его, нужно получить все установленные зависимости, скажем, из хранилища Ubuntu, или предоставить их самим, что может быть утомительной задачей. apt-getустанавливать бинарные пакеты, пока pipсобирает их после загрузки. Не следует использовать pip для установки модулей в системных местах. Это совершенно неправильно. Всегда используйте --userфлаг, чтобы установить модуль в домашнее местоположение. Правильно настроенный PYTHONPATH позволяет python сначала забрать модули из HOME, а затем системные модули, установленные с apt-get.

Местиа
источник