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

Может кто-нибудь, пожалуйста, объясните мне, что происходит с 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, чтобы указать на один из dist-packages?
  • На какие dist-пакеты я должен указывать? /usr/lib/python2.6/dist-packages или /usr/local/lib/python2.6/dist-packages/
  • В чем смысл /usr/lib/python2.6/site-packages? Там ничего нет!
  • Приходится ли сначала сначала на путь? Если у меня есть более новая версия пакета XYZ, установленная в /usr/local/lib/python2.6/dist-packages/ и более старая (из ubuntu repos/apt-get) в /usr/lib/python2.6/dist-packages, которая импортируется, когда я import xyz? Я предполагаю, что это основано на списке путей, да?
  • Почему, черт возьми, это так запутанно? Здесь что-то не хватает?
  • Где определено, что easy_install должен установить на /usr/local/lib/python2.6/dist-packages?
  • Будет ли это влиять на pip?

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

Ответ 1

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

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

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

Re 4, да, предыдущие записи на пути имеют приоритет.

Re 5, easy_install легко только в его названии - он делает так много темной магии, что его тщательно держали вне стандартной библиотеки python, несмотря на его удобство, потому что консенсус среди нас, коммандеров python, заключается в том, что глубокая темная магия для удобства "легко" только на поверхности.

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

Re 7, извините, не знаю. У меня нет разумного недавнего ubuntu под рукой, чтобы проверить.

Ответ 2

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

Исходное содержание почты:

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

Система работает, по крайней мере, если вы используете виртуальный пакет Ubuntu. У некоторых людей были проблемы с использованием локально установленных виртуальных Ubuntu, потому что магические записи sys.path не добавлялись или что нибудь. Я не уверен в отношении -no-site-пакетов, потому что я никогда не использую эта опция: я запускаю 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/python 2.6/dist-packages

Да

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

Да

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

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

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

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

  1. Будет ли это влиять на пип?

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

Ответ 3

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

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

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

Не обновляйте и не модифицируйте установленную Ubuntu систему Python.

Ответ 4

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

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

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

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

Ответ 5

Другой способ исправить:
fooobar.com/info/93190/...

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