Как получить virtualenv для использования dist-пакетов на Ubuntu?

Я знаю, что virtualenv, если не передал аргумент --no-site-packages при создании новой виртуальной среды, свяжет пакеты в /usr/local/lib/python2.7/site-packages (для Python 2.7) с вновь созданной виртуальной средой. На Ubuntu 12.04 LTS у меня есть три местоположения, где могут быть установлены пакеты Python 2.7 (с использованием установленной по умолчанию Ubuntu Python 2.7):

  • /usr/lib/python2.7/dist-packages: у меня есть моя глобальная установка пакетов ipython, scipy, numpy, matplotlib, которые мне сложнее и трудоемко устанавливать отдельно (и все их зависимости), если они недоступны через scipy stack.
  • /usr/local/lib/python2.7/site-packages: это пусто, и я думаю, что он останется таким же на Ubuntu, если я не установлю пакет из исходного кода.
  • /usr/local/lib/python2.7/dist-packages: у этого есть очень важные локальные пакеты для астрономии, особенно те, которые связаны с PyRAF, STScI и т.д., и они чрезвычайно сложны и трудоемки для установки отдельно.

Обратите внимание, что глобальная директория, такая как /usr/lib/python2.7/site-packages, не существует в моей системе. Также обратите внимание, что моя глобальная установка ipython, scipy и т.д. Позволяет мне использовать эти пакеты "на лету" без необходимости запускать/активировать виртуальную среду каждый раз.

Естественно, теперь я хочу использовать virtualenv для создания одной виртуальной среды в домашнем каталоге пользователя, который я буду использовать для будущих проектов. Тем не менее, я хотел бы, чтобы эта виртуальная среда была создана, чтобы связать/скопировать все мои пакеты в местах (1) и (3) в списке выше. Основная причина этого заключается в том, что я не хочу проходить процесс pip install (если это вообще возможно) для повторной установки ipython, scipy, astro-пакетов и т.д. Для этого (и, возможно, другого) виртуального сред.

Вот мои вопросы:

  • Есть ли способ указать virtualenv, что я хотел бы, чтобы он связывал/копировал пакеты в этих двух каталогах dist-packages для виртуальных сред, которые создаются в будущем?
  • Когда я в конечном итоге обновляю мою глобальную установку scipy, ipython и т.д. в двух каталогах dist-packages, будет ли это также обновлять/изменять пакеты, используемые моей виртуальной средой (и которые они изначально получили при создании виртуального виртуального диска)?
  • Если я когда-нибудь установил пакет из источника в Ubuntu, он будет идти в /usr/local/lib/python2.7/dist-packages или /usr/local/lib/python2.7/site-packages?

Заранее благодарим за помощь!

Ответ 1

Это может быть законным использованием PYTHONPATH - переменной окружения, которая virtualenv не касается, которая использует тот же синтаксис, что и переменная окружения PATH, в bash PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages в .bashrc или похожие. Если вы следуете этому пути,

  • Вам вообще не нужно рассказывать об этой виртуальной среде, он не будет пытаться ее изменить.

  • Никаких повторений не потребуется, и

  • Это будет продолжаться, куда бы он ни пошел (pip install всегда использует/usr/local/lib/python2.7/dist-packages/для моего Ubuntu), если вы устанавливаете их вне вашей виртуальной среды. Если вы установите их из своей виртуальной среды (пока она активирована), то, конечно, она будет помещена в виртуальную среду.

Ответ 2

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

  • Поскольку virtualenv 1.7 - не-сайт-пакеты были по умолчанию. Поэтому использование флага --system-site-packages для virtualenv - это все, что необходимо для получения dist-пакетов на вашем пути - если вы используете измененный virtualenv, отправленный Ubuntu. (Этот ответ и этот дают некоторую полезную историю). Я тестировал это, и он работает.

    $ virtualenv --system-site-packages .

  • Я согласен с Томасом здесь - я не вижу никаких действий, требуемых в virtualenv, чтобы увидеть эффект обновлений в dist-пакетах.

  • Протестировав это с помощью python setup.py install, он (опять же, как сказал Томас) все еще идет на dist-пакеты. Вы можете изменить это, создав свой собственный python, но немного экстремальный.

Ответ 3

PYTHONPATH работает для меня.

vim ~/.bashrc

добавьте эту строку ниже:

export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
source ~/.bashrc

Ответ 4

То, что вы хотите достичь, по существу, добавляет определенную папку (dist-packages) в путь поиска Python. У вас есть несколько вариантов для этого:

  • Используйте конфигурацию конфигурации пути (.pth), записи будут добавлены к системному пути.
  • Изменить PYTHONPATH (записи из него идут в начало системного пути).
  • Измените sys.path непосредственно с вашего Python script, то есть добавьте в него необходимые папки.

Я думаю, что для этого конкретного случая (включить глобальную папку dist-packages) третий вариант лучше, потому что с первым параметром вам нужно создать файл .pth для каждого виртуального пользователя, с которым вы будете работать (с некоторой внешней оболочкой script?). Это легко забыть, когда вы распространяете свой пакет. Второй вариант требует установки времени выполнения (добавить envvar), который, опять же, легко пропустить.

И только третий вариант не требует каких-либо предварительных условий в режиме конфигурации или времени выполнения и может быть распространен без проблем (в системе одинакового типа, конечно).

Вы можете использовать такую ​​функцию:

def enable_global_distpackages():
    import sys
    sys.path.append('/usr/lib/python2.7/dist-packages')
    sys.path.append('/usr/local/lib/python2.7/dist-packages')

И затем в __init__.py файле вашего пакета:

enable_global_distpackages()

Ответ 5

В каталоге site-packages создайте файл dist.pth В файле dist.path введите следующее: ../dist-packages

введите описание изображения здесь

Теперь отключите и активируйте свой virtualenv. Вы должны быть установлены.