Пакеты перезаписи 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 знает, какую из двух версий использовать?
Фред С.

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

Ответы:


3

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

  • '' (каталог приложения)
  • '/usr/local/lib/python2.7/dist-packages' (где pip устанавливает модули)
  • '/usr/lib/python2.7/dist-packages' (где apt устанавливает модули)

Однако наиболее важно отметить, что «/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. В моей системе пути apt и pip поменялись местами. Должно быть (игнорируя другие записи):

  • '/usr/local/lib/python2.7/dist-packages' (где pip устанавливает модули)
  • '/usr/lib/python2.7/dist-packages' (где apt устанавливает модули)

Однако из-за неизвестного действия, которое я должен был предпринять, эти пути появились для меня в обратном порядке (игнорируя другие записи):

  • '/usr/lib/python2.7/dist-packages' (где apt устанавливает модули)
  • '/usr/local/lib/python2.7/dist-packages' (где pip устанавливает модули)

Оказывается, кое-что я добавил /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.