2011-08-04 20 views
55

Quiero activar una instancia de virtualenv a partir de un script de python.Activar un virtualenv con un script de python

Sé que es bastante fácil de hacer, pero todos los ejemplos que he visto lo usan para ejecutar comandos dentro del entorno y luego cerrar el subproceso.

Lo que quiero es simplemente activar el virtualenv y regresar al shell, de la misma manera que lo hace bin/activate.

Algo como esto:

$me: my-script.py -d env-name 
$(env-name)me: 

Es esto posible?

Relevante:

http://groups.google.com/group/python-virtualenv/browse_thread/thread/15f8a9b0506abeae

Respuesta

2

Niño env proceso se pierde en el momento en que deja de existir y mover el contenido medio de allí a los padres es un poco complicado.

Lo que probablemente necesite hacer es generar un script de shell (puede generar uno dinámicamente en/tmp) que generará variables de entorno de virtualenv en un archivo, que luego leerá en el proceso principal de Python y se colocará en el sistema operativo. reinar.

O simplemente analiza el script activando el uso de la línea en abierto ("bin/activate") y extrae manualmente cosas y colóquelas en os.environ. Difícil, pero no imposible.

+2

¿Quiere decir algo como esto? https://bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/virtualenv_support/activate_this.py –

14

Resulta que sí, el problema no es simple, pero la solución es.

Primero tuve que crear un script de shell para ajustar el comando "fuente". Dicho esto, usé el "." en su lugar porque he leído que es mejor usarlo que fuente para scripts bash.

#!/bin/bash 
. /path/to/env/bin/activate 

Luego de mi script en Python, simplemente puede hacer esto:

import os 
os.system('/bin/bash --rcfile /path/to/myscript.sh') 

El truco radica en el argumento --rcfile.

Cuando el intérprete de Python sale de él, abandone el shell actual en el entorno activado.

¡Gana!

+1

Esta es una solución excelente y elegante. – Glycerine

+2

Realmente no lo entiendo. ¿Por qué no haces eso: 'os.system ('/ bin/bash --rcfile ruta/a/env/activar')' Ya sabes, cuando se inicia una instancia de bash, se necesita .bashrc como argumento para el --rcfile. Así que solo especifique que el archivo de registro es su archivo de activación ... ¿No? – Depado

+0

@Depado Acabo de probar su solución y esto activará el shell dentro de python. al menos cuando lo intento en el caparazón. >>> os.system ('/ bin/bash --rcfile/var/envs/test/bin/activate') (prueba) tcraig @ tallis-desktop: ~ $ (prueba) tcraig @ tallis-desktop : ~ $ ls -l total 706288 – Trenton

52

Si desea ejecutar un subproceso Python bajo el virtualenv, puede hacerlo mediante la ejecución del script con el intérprete de python que vive dentro virtualenv de/bin /:

# path to a python interpreter that runs any python script 
# under the virtualenv /path/to/virtualenv/ 
python_bin = "/path/to/virtualenv/bin/python" 

# path to the script that must run under the virtualenv 
script_file = "must/run/under/virtualenv/script.py" 

subprocess.Popen([python_bin, script_file]) 

Sin embargo, si desea activar el virtualenv bajo el intérprete de python actual en lugar de un subproceso, se puede utilizar el script activate_this.py:

# doing execfile() on this file will alter the current interpreter's 
# environment so you can import libraries in the virtualenv 
activate_this_file = "/path/to/virtualenv/bin/activate_this.py" 

execfile(activate_this_file, dict(__file__=activate_this_file)) 
+1

//, ¿No debería esa última línea en el primer bloque de código en esta respuesta leer lo siguiente: 'subprocess.Popen ([venv_python_file, script_file])'? –

+0

//, Además, ¿hay alguna manera de ejecutar el 'script_file' desde una ubicación arbitraria, o tiene que estar en el directorio' virtualenv'? –

+0

Solucionado, gracias por notar el error. En cuanto a su segunda pregunta, no 'script_file' no tiene que estar en el directorio virtualenv, puede estar en cualquier lugar. –

4

Sólo una solución simple que funciona para mí. No sé por qué necesitas el script bash, que básicamente hace un paso inútil (¿Estoy equivocado?)

import os 
os.system('/bin/bash --rcfile flask/bin/activate') 

Lo que básicamente hace lo que necesita:

[[email protected] Foundation]$ python2.7 pythonvenv.py 
(flask)[[email protected] Foundation]$ 

Entonces, en lugar de desactivar el Venv, simplemente Ctrl + D o de salida.
¿Es esa una posible solución o no es lo que querías?

1

Para ejecutar otro entorno Python según la Virtualenv documentation oficial, en la línea de comandos se puede especificar la ruta completa al binario pitón ejecutable, sólo que (sin necesidad de activar el virtualenv antes):

/path/to/virtualenv/bin/python myscript.py 

lo mismo se aplica si desea invocar un script desde la línea de comandos con su virtualenv, que no es necesario para activarlo antes:

me$ /path/to/virtualenv/bin/python myscript.py 

lo mismo para entorno Windows (si es de la línea de comandos o desde una secuencia de comandos :

> \path\to\env\Scripts\python.exe myscript.py 
+0

La pregunta es: Activar un virtualenv con un script de python (NO desde el shell) – zHs

+1

Sí, mi punto es que puede llamar el tiempo de ejecución de python desde un entorno virtual sin la necesidad de activarlo antes, desde la consola o desde un script. Voy a aclarar la respuesta, gracias! – Mrdev

+0

¡Oh Dios mío! No pensé en eso. esta es la única solución que funcionó para mí :). Ahora, cuando estoy ejecutando el script de python desde php, estoy usando: "path/to/virtualenv/bin/python mypythonscript.py" – zHs

12

solución más simple para ejecutar la secuencia de comandos bajo el intérprete de virtualenv es reemplazar la línea shebang por defecto con la ruta de intérprete de su virtualenv al igual que al comienzo de la secuencia de comandos:

#!/path/to/project/venv/bin/python 

Haga el script ejecutable:

chmod u+x script.py 

ejecuta el script:

./script.py 

Voila!

+1

¡Solución perfecta y directa! – user2436428

+1

+1 por elegancia. Nota sobre Windows esto requiere un entorno compatible con posix que comprenda las líneas de shebang como cygwin o msys – qneill

+0

¡Funciona para Python 3.6.3 y Windows 10! – toonarmycaptain

Cuestiones relacionadas