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

StackOverflow https://stackoverflow.com/questions/1215610

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

$ sudo apt-получить установку python-setuptools (6.0c9) $ sudo apt-получить установку python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip устанавливает virtualenvwrapper

Виртуальные серверы таким образом работают нормально, хотя я не пробовал --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-пакеты, которые импортируются при импорте xyz?Я предполагаю, что это основано на списке путей, да?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top