
Если у меня есть некоторый пакет Python в /usr/share/pyshared/
или /usr/lib/pythonX.Y/dist-packages/
(например, возьмем python-numpy
или python-scipy
), как мне добавить этот пакет в virtualenv?
При добавлении пакета в virtualenv требуется ли использовать «обычный» метод установки Python ( setpy.py
и т. п.) или использовать свой собственный?
По сути, я хочу иметь возможность легко добавлять пакеты Python, имеющие сложные расширения C ( numpy
, scipy
, pyQt/pyside
, pygtk
и т. д.), в virtualenv.
решение1
Как вы и указали, зачастую лучшим вариантом является изготовление колеса, особенно если вы регулярно его переустанавливаете.
Для привязок python gtk это не сработало для меня, и мне нужен был какой-то способ протестировать код с помощью tox
(который собирает virtualenv для вас с помощью --no-site-packages). Для целей тестирования было бы достаточно (для меня) связать соответствующие установленные в системе версии, но не все из site-packages
/ dist-packages
.
Для этого я создал устанавливаемый пакет (ruamel.venvgtk
), который устанавливает правильные ссылки для Python2.7 и Python3.4 в системах на базе Debian (Ubuntu, Linux Mint). Это происходит во время установки программы, поэтому нет необходимости менять программу. Раздел tox.ini
файла deps
выглядит так:
deps =
pytest
ruamel.venvgtk
и для любого созданного virtualenv pip
будут установлены ruamel.venvgtk
и созданы соответствующие ссылки.
решение2
Да, когда ваше virtualenv активно, вам необходимо установить требуемый пакет с помощью distutils, «нормального» метода установки Python ( python setup.py install
), или с помощью инструмента, поддерживающего virtualenv (например pip install package
).
Версия пакета, которую вы устанавливаете, будет активной версией пакета для virtualenv. Неважно, создаете ли вы virtualenv с помощью virtualenv MY_ENV
или virtualenv --no-site-packages MY_ENV
. В первом случае все пакеты, установленные в вашей системе Python, будут доступны в virtualenv, но любой пакет, который вы устанавливаете в virtualenv, будет маскировать версию в вашей системе Python, пока virtualenv активен. Во втором случае у вас будет изолированная среда Python в virtualenv, в которой будут доступны только стандартные библиотечные пакеты и все, что вы там устанавливаете.
Имейте в виду, что такие пакеты, как Numpy и Scipy, не предоставляют готовых двоичных файлов для Linux, поэтому вам нужно будет уметь собирать их самостоятельно, если вы не хотите использовать версии, доступные через менеджер пакетов.
решение3
Я полагаю, что поскольку этот вопрос не был задан больше года (по состоянию на март 2014 года), никто не может дать на него ответа, поэтому я напишу, как я решил эту проблему.
Для пакетов, исходный метод установки которых учитывает virtualenv (numpy/scipy, pyside), используйте wheels, чтобы избежать необходимости пересборки в каждом venv.
Для пакетов, которые этого не делают (GTK), это зависит от того, как они подключаются к Python.