Zainstaluj pakiet w virtualenv za pomocą apt-get

16

Zgodnie z tą odpowiedzią , apt-getinstaluje pakiety w całym systemie (z kanoniczne), i tylko pipmożna zainstalować pakiety w virtualenv (od PyPI).

Jednak muszę zainstalować pakiet w virtualenv, który jest dostępny tylko przez apt-get, tj. Nie jest hostowany przez Pypi.

Jak mogę to zrobić?

rzymski
źródło
Ładne pytanie, kolego.
rɑːdʒɑ

Odpowiedzi:

8

Inną alternatywą jest pobranie pliku apt-get download, wyodrębnienie go dpkg -xi przeniesienie wyodrębnionych plików do virtualenv:

Przykład:

apt-get download python-xyz

załóżmy, że skutkuje to:

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

Następnie użyj dpkg, aby wyodrębnić część danych pliku .deb:

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

W nowo utworzonym ./xyz-tmpkatalogu masz teraz wszystkie pliki, które zostałyby zainstalowane /(root), gdybyś go użył apt-get install.

Załóżmy, że są:

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

Nadal musisz zmapować podkatalogi (np. dist-packagesVs. site-packages), a następnie możesz przenieść pliki do swojego virtualenv (zakładając virtualenv /home/user/.virtualenvs/py27):

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

W porównaniu z moją poprzednią odpowiedzią, to podejście ma tę zaletę, że nie musisz badać, które pliki zostały zainstalowane, ponieważ możesz je zobaczyć w katalogu rozpakowywania. Nadal wymaga mapowania katalogów między rozpakowanym archiwum a virtualenv.

Andreas Maier
źródło
+1, oto kolejny przykład tego podejścia, które działa całkiem dobrze, aby zainstalować pakiety, które są dostępne tylko przez APT do virtualenv - ostatnio zrobił coś podobnego przy użyciu Pythona 3.7.
RichVel
0

Wszystko, co jest potrzebne do virtualenv, to obecność plików pakietu w poddrzewie virtualenv. Tak długo, jak możesz określić, które pliki zostały zainstalowane w systemie Python za pomocą apt-get, możesz skopiować je do virtualenv. Obejmuje to pliki w katalogu pakietów serwisu, a także w innych miejscach poddrzewa Pythona (np. Skrypty).

Hipotetyczny przykład:

sudo apt-get python-xyz

Załóżmy, że instaluje pakiet o nazwie „xyz” w systemie Python 2.7, możesz otrzymać:

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

Skopiuj pliki związane z pakietem „xyz” na virtualenv (zakładając 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

Trudność polega na (1) w określeniu, które pliki należą do konkretnego pakietu, oraz (2) w odwzorowaniu odpowiednich podkatalogów między systemem Python a virtualenv (np. dist-packagesVs. site-packagesw powyższym przykładzie).

Jeśli ktoś ma z tym więcej doświadczenia, prosimy o komentarz.

Andreas Maier
źródło