Установите пакет в virtualenv с помощью apt-get

16

Согласно этому ответу , apt-getустанавливает пакеты в масштабе всей системы (из канонических) и pipможет устанавливать пакеты только в virtualenv (из Pypi).

Однако мне нужно установить пакет в virtualenv, который доступен только через apt-get, то есть не размещен на Pypi.

Как мне это сделать?

Роман
источник
Хороший вопрос, приятель.
rɑːdʒɑ

Ответы:

8

Другой вариант - скачать файл apt-get download, распаковать его dpkg -xи переместить извлеченные файлы в папку virtualenv:

Пример:

apt-get download python-xyz

предположим, что это приводит к:

./python-xyz_1.2.3-3ubuntu5_amd64.deb

Затем используйте dpkg для извлечения части данных из файла .deb:

dpkg -x python-xyz_1.2.3-3ubuntu5_amd64.deb ./xyz-tmp

Во вновь созданном ./xyz-tmpкаталоге у вас есть все файлы, которые были бы установлены в /(root), если бы вы использовали apt-get install.

Предположим, что они:

./xyz-tmp/usr/lib/python2.7/dist-packages/xyz/
./xyz-tmp/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

Вам все еще нужно отобразить подкаталоги (например, dist-packagesvs. site-packages), и затем вы можете переместить файлы в ваш virtualenv (при условии, что virtualenv /home/user/.virtualenvs/py27):

mv ./xyz-tmp/usr/lib/python2.7/dist-packages/* /home/user/.virtualenvs/py27/lib/python2.7/site-packages/

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

Андреас Майер
источник
+1, вот еще один пример этого подхода, который хорошо работает для установки пакетов, которые доступны только через APT, в virtualenv - недавно сделал что-то подобное, используя Python 3.7.
RichVel
0

Все, что нужно для virtualenv - это наличие файлов пакета в поддереве вашего virtualenv. Так что, пока вы можете определить, какие файлы были установлены в системный Python через apt-get, вы можете копировать их в ваш virtualenv. Это включает в себя файлы в каталоге пакетов сайта, а также в других местах вашего поддерева Python (например, скрипты).

Гипотетический пример:

sudo apt-get python-xyz

Предположим, он устанавливает пакет с именем «xyz» в вашу систему Python 2.7, вы можете получить это:

/usr/lib/python2.7/dist-packages/xyz/
/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

Скопируйте файлы, связанные с пакетом "xyz", в ваш virtualenv (при условии, что virtualenv /home/user/.virtualenvs/py27):

/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy/
/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy-1.2.3.egg-info

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

Если у кого-то есть больше опыта с этим, пожалуйста, прокомментируйте.

Андреас Майер
источник