Instale el paquete en virtualenv usando apt-get

16

Según esta respuesta , apt-getinstala paquetes en todo el sistema (desde canónico), y solo pippuede instalar paquetes en un virtualenv (desde Pypi).

Sin embargo, necesito instalar un paquete en un virtualenv al que solo se puede acceder a través de apt-get, es decir, no está alojado por Pypi.

¿Cómo puedo hacer eso?

romano
fuente
Buena pregunta, Pal.
rɑːdʒɑ

Respuestas:

8

Otra alternativa es descargar el archivo con apt-get download, extraerlo dpkg -xy mover los archivos extraídos a su virtualenv:

Ejemplo:

apt-get download python-xyz

Supongamos que esto da como resultado:

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

Luego, use dpkg para extraer la porción de datos del archivo .deb:

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

En el ./xyz-tmpdirectorio recién creado , ahora tiene todos los archivos que se habrían instalado en /(root) si los hubiera utilizado apt-get install.

Supongamos que son:

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

Todavía necesita asignar los subdirectorios (p. Ej., dist-packagesVs. site-packages), y luego puede mover los archivos a su virtualenv (suponiendo un virtualenv /home/user/.virtualenvs/py27):

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

En comparación con mi respuesta anterior, este enfoque tiene la ventaja de que no tiene que investigar qué archivos se instalaron, porque puede verlos en el directorio de extracción. Todavía requiere una asignación de directorios entre el archivo extraído y el virtualenv.

Andreas Maier
fuente
+1, aquí hay otro ejemplo de este enfoque, que funciona bastante bien para instalar paquetes a los que solo se puede acceder a través de APT en un virtualenv: hizo algo similar recientemente usando Python 3.7.
RichVel
0

Todo lo que se necesita para un virtualenv es la presencia de los archivos del paquete en el subárbol de su virtualenv. Entonces, siempre que pueda determinar qué archivos se instalaron en el sistema Python a través de apt-get, puede copiarlos en su virtualenv. Esto incluye archivos en el directorio de paquetes del sitio, así como en otros lugares dentro de su subárbol de Python (por ejemplo, scripts).

Ejemplo hipotético:

sudo apt-get python-xyz

Suponga que instala un paquete llamado "xyz" en su sistema Python 2.7, puede obtener esto:

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

Copie los archivos relacionados con el paquete "xyz" en su virtualenv (suponiendo un 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

La dificultad es (1) determinar qué archivos pertenecen a un paquete en particular y (2) mapear los subdirectorios correspondientes entre el sistema Python y el virtualenv (p. Ej., dist-packagesVs. site-packagesen el ejemplo anterior).

Si alguien tiene más experiencia con esto, por favor comente.

Andreas Maier
fuente