Activar un virtualenv con un script Python

Resuelto h3. asked hace 13 años • 0 respuestas

Quiero activar una instancia de virtualenv desde 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.

Simplemente quiero activar virtualenv y volver 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?

Importante:

virtualenv › Invocar un entorno desde un script

h3. avatar Aug 04 '11 21:08 h3.
Aceptado

Si desea ejecutar un subproceso de Python en virtualenv, puede hacerlo ejecutando el script usando el intérprete de Python que se encuentra dentro del bin/directorio de virtualenv:

import subprocess

# 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 de Python actual en lugar de un subproceso, puede llamar execpasando el activate_this.pyscript, de esta manera:

# Doing exec() 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"

exec(open(activate_this_file).read(), {'__file__': activate_this_file})

Tenga en cuenta que necesita utilizar la biblioteca virtualenv , no venv , para lo anterior.

Si usa venv, puede copiar la implementación de enable_this.py de virtualenv; aún debería funcionar más o menos con venv con solo unos pocos cambios menores.

Lie Ryan avatar Feb 09 '2013 22:02 Lie Ryan

La solución más sencilla para ejecutar su script bajo el intérprete de virtualenv es reemplazar la línea shebang predeterminada con la ruta al intérprete de virtualenv como se muestra al comienzo del script:

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

Haga que el script sea ejecutable:

chmod u+x script.py

Ejecute el script:

./script.py

¡Voilá!

nafooesi avatar May 30 '2015 03:05 nafooesi

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

/path/to/virtualenv/bin/python

Lo mismo se aplica si desea invocar un script desde la línea de comando con su virtualenv. No es necesario activarlo antes:

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

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

> \path\to\env\Scripts\python.exe myscript.py
Mariano Ruiz avatar Apr 14 '2014 19:04 Mariano Ruiz

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

Primero tuve que crear un script de shell para empaquetar el comando "fuente". Dicho esto, usé el "." en cambio, porque leí que es mejor usarlo que la fuente para scripts Bash.

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

Luego, desde mi script de Python puedo simplemente hacer esto:

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

Todo el truco reside en el --rcfileargumento.

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

¡Ganar!

h3. avatar Aug 04 '2011 15:08 h3.

Sólo una solución simple que funciona para mí. No sé por qué necesitas el script Bash que básicamente realiza un paso inútil (¿me equivoco?)

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

Que básicamente hace lo que necesitas:

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

Luego, en lugar de desactivar el entorno virtual, simplemente haga clic en Ctrl+ Do salga. ¿Es esa una posible solución o no es lo que querías?

Depado avatar Aug 03 '2013 22:08 Depado