tutorial instalar entorno crear activar python virtualenv

instalar - virtualenv python 3 tutorial



Activar un virtualenv con un script de python (6)

Quiero activar una instancia de virtualenv a partir de 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 posible ?

Pertinente:

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


El proceso hijo env se pierde en el momento en que deja de existir y mover el contenido del entorno de allí a los padres es algo 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 os.environ.

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


La solución más simple para ejecutar su script bajo el intérprete de virtualenv es reemplazar la línea shebang por defecto con la ruta al intérprete de su virtualenv como al principio del script:

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

Hacer el script ejecutable:

chmod u+x script.py

Ejecute el script:

./script.py

Voila!


Para ejecutar otro entorno de Python de acuerdo con la documentación oficial de Virtualenv , en la línea de comandos puede especificar la ruta completa al binario ejecutable de python, solo eso (no es necesario activar el virtualenv anteriormente):

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

Lo mismo se aplica si desea invocar un script desde la línea de comando con su virtualenv, no necesita activarlo antes:

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

Lo mismo para el entorno de Windows (ya sea desde la línea de comandos o desde un script:

> /path/to/env/Scripts/python.exe myscript.py


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, desde mi script de python, simplemente puedo hacer esto:

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

Todo el truco se encuentra dentro del argumento --rcfile.

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

Ganar !


Si desea ejecutar un subproceso de Python bajo el virtualenv, puede hacerlo ejecutando el script utilizando el intérprete de python que se encuentra dentro del directorio virtualenv / 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 virtualenv bajo el intérprete actual de python en lugar de un subproceso, puede usar 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))


Solo 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'')

Que básicamente hacen lo que necesitan:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py (flask)[hellsing@silence Foundation]$

Luego, en lugar de desactivar el venv, simplemente presione Ctrl + D o salga.
¿Es esa una posible solución o no es eso lo que querías?