Haga que virtualenv herede paquetes específicos de sus paquetes de sitio globales

209

Estoy buscando una manera de hacer un virtualenv que contendrá solo algunas bibliotecas (que elegí) de la instalación base de Python.

Para ser más concreto, estoy tratando de importar mi matplotlib a virtualenv durante la creación de virtualenv. No se puede instalar de manera eficiente con pip o easy_install, ya que pierde algunas librerías compiladoras fortran. La forma en que lo hacía hasta ahora era copiar manualmente desde

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

sin embargo, esto evita que los enlaces importados manualmente sean registrados por yema (que imprime todas las bibliotecas disponibles actualmente en virtualenv).

Entonces, ¿hay alguna manera de hacer una variante selectiva de

virtualenv --system-site-packages
El ingeniero significante
fuente
16
un recordatorio amable: seleccione una respuesta si una de las siguientes parece funcionar.
foobarbecue
1
parece que 12 personas te han hecho pruebas en los últimos meses ...
foobarbecue
2
¿Por qué molestar a la OP? Todos podemos ver cuál es la respuesta más popular; ¿Realmente importa si él lo acepta? Creo que su integridad al probarse a sí mismo, en lugar de simplemente marcar la respuesta más popular, debería ser admirada.
Michael Scheper el
55
2013: Las puntuaciones de respuesta entre respuestas correctas e incorrectas son bastante similares. OP dice que lo probará. 2016: Michael Scheper está tan impresionado que OP (hace tres años) dijo que probaría. 2017: Me encuentro con esta pregunta nuevamente y me divierte.
foobarbecue
2
No hay una respuesta correcta. OP pidió selectivo --system-site-packages. Respuestas sugiere usar no selectivo --system-site-packagesy luego sobreinstalar algunos paquetes localmente, lo que es diferente y tiene implicaciones diferentes.
Piotr Jurkiewicz

Respuestas:

239

Crea el entorno con virtualenv --system-site-packages. Luego, active virtualenv y cuando desee que las cosas se instalen en virtualenv en lugar del sistema python, use pip install --ignore-installedo pip install -I. De esa manera, pip instalará lo que ha solicitado localmente, aunque exista una versión de todo el sistema. Su intérprete de Python buscará primero en el directorio de paquetes de virtualenv, por lo que esos paquetes deberían seguir a los globales.

foobarbecue
fuente
45
Al usar -I, siempre reinstalará los paquetes, incluso si ya existen en el directorio de paquetes de sitio de todo el sistema. Si usa -U en su lugar, instalará versiones más nuevas de paquetes en su virtualenv, pero no reinstalará ningún paquete que ya esté disponible en el sistema con la versión requerida.
Danilo Bargen
15
¿Sabe si hay alguna forma de 'activar' la opción --system-site-packages en un entorno virtual creado previamente? ¡Me encantaría evitar la molestia de reinstalar todos mis paquetes locales!
Gabriel
Encontré esta respuesta muy interesante, sin embargo, tuve un caso muy extraño en el que no funcionó. Tengo un virtualenv con no-global-site-packageshabilitado. Pero por alguna razón, no sé si había un paquete que se estaba utilizando desde el sistema global. Usar pip install -Ipara el paquete desde el interior del virtualenv no funcionó. Finalmente terminé desinstalando temporalmente el paquete tanto del sistema virtualenv como global, luego pude instalarlo nuevamente en el sistema virtualenv y (en ese orden). Entonces ahora funciona bien.
kstenger
3
-1 La pregunta pide hacer visibles ciertos paquetes, no todos excepto los paquetes sombreados. La inclusión en la lista blanca de un conjunto limitado sería mucho más segura que la inclusión en la lista blanca de todo, ya que permite garantizar que todos los paquetes deben existir en el venv, excepto los explícitamente incluidos en la lista blanca.
bluenote10
19

Puede usar --system-site-packagesy luego "sobreinstalar" las cosas específicas para su virtualenv. De esa manera, todo lo que instale en su virtualenv se tomará de allí, de lo contrario, se tomará de su sistema.

schacki
fuente
No estoy exactamente seguro de lo que no está claro, pero lo intentaré: si crea un virtualenv con la opción --system-site-packages, el sistema primero intentará encontrar paquetes en su virtualenv, si no lo encuentra allí, lo hará intenta encontrarlo en la instalación de python de tu sistema. Solo si tampoco lo encuentra allí, generará e Importará error.
schacki
44
El único problema con este enfoque es que ahora tiene todas las bibliotecas del sistema. Donde es posible que desee un control muy estricto sobre lo que está instalado.
Dwayne
77
¡Lo que no está claro es cómo esto es realmente posible! Si instala pip myprog en un virtualenv creado con --system-site-packages donde myprog existe en el sistema, no "sobreinstalará" myprog. Simplemente encontrará que myprog existe y dirá "Requisito ya satisfecho". Entonces ... ¿qué quisiste decir?
foobarbecue
-5

Instalar env virtual con

virtualenv --system-site-packages

y use pip install -U to install matplotlib

Eder Martins
fuente
3
Esto es lo contrario de lo que hizo la pregunta.
Dan Getz
-7

Puedes usar virtualenv --clear. que no instalará ningún paquete, luego instale los que desee.

Brandon Poole
fuente
Esa no es una respuesta a la pregunta real sobre cómo hacer uso de algunos paquetes de todo el sistema
MrLeeh