Как получить 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. Вы должны быть установлены.