Ubuntu + virtualenv = бардак? virtualenv ненавидит dist-пакеты, хочет site-packages

Может кто-нибудь объяснить мне, что происходит с 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

Я предполагаю, что при установке пакета с помощью 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/apt-get) в /usr/lib/python2.6/dist-packages, какая из них будет импортирована, когда я import xyz? Я предполагаю, что это основано на списке путей, да?
  5. Почему, черт возьми, это так запутанно? Есть ли что-то, что мне здесь не хватает?
  6. Где определено, что easy_install должен устанавливаться на /usr/local/lib/python2.6/dist-packages?
  7. Повлияет ли это и на pip?

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


person lostincode    schedule 01.08.2009    source источник
comment
Я подозреваю, что Ubuntu здесь не работает: нет абсолютно никакого смысла или причины переименовывать site-packages в dist-packages (для этого существует /usr/local). Однако не могу помочь вам с virtualenv.   -  person Glenn Maynard    schedule 01.08.2009
comment
Используйте переменную PYTHONPATH. [См. здесь][1] [1]: stackoverflow.com/questions/19210964/   -  person hahakubile    schedule 27.03.2014
comment
7 лет? почему этот вопрос все еще опубликован?   -  person Jonathan Neufeld    schedule 28.07.2017


Ответы (5)


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

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

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

Касательно 4, да, более ранние записи на пути имеют приоритет.

Что касается 5, easy_install проста только в названии — она делает так много темной магии, что ее старательно не включают в стандартную библиотеку Python, несмотря на ее удобство, потому что среди нас, коммиттеров Python, существует консенсус в том, что глубокая темная магия для удобства — это «легко». только на поверхности.

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

Что касается 7, извините, понятия не имею - у меня нет достаточно свежей Ubuntu, чтобы проверить.

person Alex Martelli    schedule 01.08.2009
comment
re1, я бы хотел продолжить обновление с помощью easy_install/pip. re2, в моей системе нет /usr/local/bin/python, только /usr/bin/python. кажется, что easy_install устанавливает все в /usr/local/lib/python2.x/, а apt-get устанавливает все в /usr/lib/python2.x/. re6, я обновил easy_install, используя easy_install -U setuptools. он должен использовать исходный пакет, а не Ubuntu. надеюсь, что кто-то с коробкой 9.04 сможет пролить свет на это. - person lostincode; 01.08.2009

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

Исходное содержание письма:

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

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

Таким образом, пакеты Ubuntu Python помещаются в /usr/lib/pythonVERSION/dist-packages. Или этот каталог поддержки 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-packages/, а более старая (из репозиториев ubuntu/apt-get) в /usr/lib/python2.6/dist -packages, какой из них импортируется, когда я импортирую xyz? Я предполагаю, что это основано на списке путей, да?

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

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

Это плохо задокументировано. Я понял это, просмотрев веб-сайт.

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

Да, pip автоматически установится в /usr/local/lib/pythonVERSION/site-packages. Используйте «pip install -E $VIRTUAL_ENV packagename» для установки в виртуальную среду.

person Jorge Vargas    schedule 13.10.2009

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

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

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

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

person Michael Dillon    schedule 02.08.2011

Что ж, у меня есть Ubuntu 9.04, и я быстро попытался настроить пару песочниц с пакетами сайтов и одну без них. И дела идут нормально.

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

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

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

person Shekhar    schedule 01.08.2009
comment
Сопровождающие дистрибутива должны перестать возиться с такими вещами. я должен иметь возможность использовать известные пакеты, такие как virtualenv прямо из коробки :( - person lostincode; 03.08.2009
comment
Это не отвечает на вопрос. сайт-пакеты не проблема. распределенные пакеты есть. - person dwf; 25.09.2009

Другой способ исправить это:
https://stackoverflow.com/a/17265840/202168

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

person Anentropic    schedule 23.06.2013