Ubuntu + virtualenv = беспорядок? virtualenv ненавидит dist-пакеты, хочет сайт-пакеты - PullRequest
14 голосов
/ 01 августа 2009

Может кто-нибудь объяснить мне, что происходит с python в Ubuntu 9.04?

Я пытаюсь раскрутить virtualenv, и флаг --no-site-packages, похоже, ничего не делает с Ubuntu. Я установил virtualenv 1.3.3 с easy_install (который я обновил до setuptools 0.6c9), и, кажется, все установлено до /usr/local/lib/python2.6/dist-packages

I предполагает , что при установке пакета с помощью apt-get он помещается в /usr/lib/python2.6/dist-packages/?

Проблема в том, что есть /usr/local/lib/python2.6/site-packages, который просто сидит там, будучи пустым. Казалось бы (глядя на path в virtualenv), что эта папка virtualenv использует в качестве резервной копии. Таким образом, даже если я опущу --no-site-packages, я не могу получить доступ к своим локальным системным пакетам из любого моего virtualenv.

Итак, мои вопросы:

  1. Как мне заставить virtualenv указать на один из dist-packages?
  2. На какие dist-пакетов я должен указать это? /usr/lib/python2.6/dist-packages или /usr/local/lib/python2.6/dist-packages/
  3. Какой смысл /usr/lib/python2.6/site-packages? Там ничего нет!
  4. Это первое пришло первым обслужено на пути? Если у меня установлена ​​более новая версия пакета XYZ в /usr/local/lib/python2.6/dist-packages/ и более старая версия (из ubuntu repos / apt-get) в /usr/lib/python2.6/dist-packages, какая из них будет импортирована, когда я import xyz? Я предполагаю, что это основано на списке путей, да?
  5. Какого черта это так запутанно? Я что-то упускаю здесь?
  6. Где определено, что easy_install следует установить на /usr/local/lib/python2.6/dist-packages?
  7. Будет ли это влиять и на pip?

Спасибо всем, кто может это прояснить!

Ответы [ 5 ]

16 голосов
/ 13 октября 2009

Я считаю, что ответ Майка Орра из списка рассылки virtual-env кажется лучшим. Обратите внимание, что ФП опубликовал этот вопрос в обоих местах.

Оригинальное содержание письма:

лет назад Debian создал / usr / local / lib / pythonVERSION / site-packages, и скомпилировал двоичный файл Python, чтобы включить его в поиск по умолчанию дорожка. Ubuntu последовал примеру Debian, как обычно. Питон разработчикам не понравилось это, потому что вы получите вмешательство в локально установленный / usr / local / bin / python с использованием тех же пакетов сайта каталог. Ubuntu наконец-то решила отказаться от сайтов-пакетов и использовать вместо этого dist-packages - имя, которое они придумали, чтобы оно не мешать ни с чем. История где-то там, если Вы гуглите это, где-нибудь в трекере ошибок Python или distutils SIG или например.

Система работает, по крайней мере, если вы используете пакет Ubuntu virtualenv. У некоторых людей были проблемы с использованием локально установленного virtualenv на Ubuntu, потому что магические записи sys.path не были добавлены или что-то. Я не уверен насчет --no-site-packages, потому что я никогда не использую этот вариант: я запускаю PIL и mysqldb из пакетов Ubuntu, потому что это иногда бывает сложно скомпилировать их C-зависимости. (Нужен правые заголовочные файлы, Python игнорирует заголовочные файлы и т. д.)

Итак, пакеты Ubuntu Python входят в / USR / Lib / pythonVERSION / расстояние-пакеты. Или это поддержка Python каталог по какой-то причине. Локально установленные пакеты Python входят в / usr / local / lib / pythonVERSION / dist-packages по умолчанию. Всякий раз, когда я установить систему Ubuntu 9.04, которую я запускаю:

$ sudo apt-get install python-setuptools (6.0c9) $ sudo apt-get install python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip install virtualenvwrapper

Virtualenvs отлично работает таким образом, хотя я не пробовал --no-site-packages.

Я пытаюсь раскрутить virtualenv и флаг --no-site-packages похоже, ничего не делает с Ubuntu. Я установил Virtualenv 1.3.3 с easy_install (который я обновил до setuptools 0.6c9)

Обе версии находятся в Ubuntu 9.04, так что вам будет сложнее самостоятельно, установив их локально.

и все кажется установленным в /usr/local/lib/python2.6/dist-packages

Да

Я предполагаю, что при установке пакета с помощью apt-get он помещается в / usr / lib / python2.6 / dist-packages /?

Да

  1. Это первое пришло первым обслужено на пути? Если у меня есть более новый версия пакета XYZ, установленная в /usr/local/lib/python2.6/dist- пакеты / и более старые (из репозитория ubuntu / apt-get) в / usr / lib / python2.6 / dist-packages, какой из них импортируется при импорте xyz? Я предполагаю, что это основано на списке путей, да?

sys.path сканируется по порядку. Единственное, что забавно, что .pth яйца получить раньше или позже на пути, чем некоторые люди ожидают. Но если вы используете pip для всего, что он может сделать (т.е. кроме установки pip сам, предварительно скомпилированные яйца и снимок локального каталога, который является скопируйте, а не ссылку на яйцо), у вас все равно будет много .pth яиц.

  1. Какого черта это так запутанно? Есть ли что-то, что я здесь не хватает?

Это не очень хорошо задокументировано. Я понял это, просмотрев сеть.

  1. Повлияет ли это и на пипс?

Да, pip автоматически установится в / USR / местные / Библиотека / pythonVERSION / сайт-пакеты. Используйте "pip install -E $ VIRTUAL_ENV имя_пакета "для установки в virtualenv.

9 голосов
/ 01 августа 2009

Я бы соблазнился взломать его, сделав site-packages ссылкой на dist-packages, но я предполагаю, что это может повлиять на другие случаи, когда вы хотите установить какое-либо расширение, отличное от дистрибутива ubuntu. Я не могу придумать другого ответа на вопрос 1, кроме настройки источников в virtualenv (так как ubuntu и virtualenv настолько популярны, что я не удивлюсь, если найденные версии уже существуют).

Re 2, если вы используете / usr / local / bin / python, вы должны использовать / usr / local версию lib (включая site-package) и наоборот, если вы используете / usr / bin / python .

Re 3, там будет что-то, если вы когда-нибудь установите расширение для / usr / bin / python из исходников (не через easy_install или из дистрибутива Ubuntu).

В отношении 4, да, более ранние записи в пути имеют приоритет.

В отношении 5, easy_install - это просто, только название: он творит столько темной магии, что тщательно исключается из стандартной библиотеки python, несмотря на ее удобство, потому что среди нас, приверженцев python, единодушно мнение, что глубокая темная магия для удобства «легкий» только на поверхности.

Re 6, я думаю, что это модификация Ubuntu для easy_install - если это правильно, то она определяется везде, где Canonical или другие сопровождающие Ubuntu принимают коллективные решения.

Re 7, извините, понятия не имею - у меня нет достаточно свежего Ubuntu для проверки.

4 голосов
/ 03 августа 2011

Вы действительно не должны касаться установки Python в Ubuntu, если вы не создаете инструменты системного администратора или не создаете что-то, что можно считать новой системной службой.

Если вы используете Ubuntu для разработки или развертывания приложений Python, всегда собирайте свой собственный Python из исходного кода, настраивайте его и используйте для развертывания. Таким образом, вы получите все каталоги в нужном месте, и virtualenv будет работать нормально. Если вы развернете несколько приложений Python на сервере, то сделайте ваш Python живым в каком-то месте, например /home/python или /opt/python или где-нибудь за пределами вашего домашнего каталога. Убедитесь, что у вас есть права на запись для группы разработчиков (users?), Чтобы люди могли легко добавлять пакеты.

Это также позволяет вам иметь два уровня пакетов. Те из них, которые являются вашими собственными стандартными инструментами, могут быть установлены в вашем дистрибутиве Python и быть частью архива, который вы развертываете, и только пакеты для конкретного приложения будут в virtualenv.

Не обновляйте и не изменяйте систему Ubuntu, установленную Python.

2 голосов
/ 01 августа 2009

Ну, у меня есть Ubuntu 9.04 и я быстро попытался установить пару песочниц с site-package и одну без. И все работает нормально.

Единственное отличие в подходе, который я выбрал, заключается в том, что я использовал пакет python-virtualenv в Ubuntu (1.3.3). И предположим, что он настроен командой Ubuntu для соответствия настройкам Ubuntu.

Чтобы подвести итог, отключите easy_installed virtualenv на некоторое время, используйте упакованный python-virtualenv и посмотрите, соответствует ли оно вашим ожиданиям.

На самом деле мы используем аналогичные настройки для производства без каких-либо проблем. Остальным уже ответил Алекс.

1 голос
/ 24 июня 2013

Еще один способ это исправить:
https://stackoverflow.com/a/17265840/202168

Не забывайте делать это в каждом virtualenv, где вам это нужно, но не полагайтесь на хаки или специальную версию virtualenv

...