Activar un virtualenv con un script Python
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
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 exec
pasando el activate_this.py
script, 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.
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á!
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
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 --rcfile
argumento.
Cuando el intérprete de Python sale, deja el shell actual en el entorno activado.
¡Ganar!
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?