Solución:
Solo deactivate
. Funcionará tanto en el script como en la línea de comandos, siempre que utilice bash.
Editar: también en la mayoría de los casos es una mejor idea deletrear la ruta completa de Python en sus scripts y servicios. No tiene estado, es más portátil y funciona prácticamente en todas partes. Entonces en lugar de hacer
. $VENV/bin/activate
/path/to/my/script.py --parameters
generalmente es preferible hacer
$VENV/bin/python /path/to/my/script --parameters
Créame, le ahorrará tiempo de depuración)
Será difícil hacer que un servicio como ese sea útil.
. ${VENV}/activate # note the dot
o
source ${VENV}/activate
Obtendrá el activate
script, es decir, ejecutar su contenido como si fueran parte del shell o script donde los obtiene. virtualenvironment
‘s activate
está diseñado para este uso. Por el contrario, simplemente ejecutar el script normalmente con
${VENV}/activate # note: NO dot and NO 'source' command
ejecutará su contenido en una subcapa y no tendrá ningún efecto útil.
Sin embargo, su script de servicio ya se ejecutará en una subcapa propia. Entonces, a excepción de los comandos de Python que ejecute como parte del proceso de inicio del servicio, no tendrá ningún efecto.
En el lado positivo, ni siquiera tendrá que preocuparse por desactivar el entorno, a menos que desee ejecutar aún más cosas de Python en el proceso de inicio del servicio, pero fuera de su virtualenv.
los deactivate
“comando” proporcionado por virtualenvwrapper
es en realidad una función de shell, del mismo modo que para workon
. Si tiene un entorno virtual activo, puede enumerar los nombres de estas funciones con typeset -F
.
Para usarlos en un script, deben definirse allí, porque las funciones de shell no se propagan a shells secundarios.
Para definir estas funciones, obtenga el virtualenvwrapper.sh
script en el script de shell donde pretende invocar estas funciones, por ejemplo:
source $(which virtualenvwrapper.sh)
Eso le permite invocar estas funciones en su script de shell como lo haría en el shell:
deactivate
Actualizar: Lo que describí funciona para las otras funciones proporcionadas por virtualenvwrapper (p. Ej. workon
). Supuse incorrectamente que también funcionaría para desactivar, pero ese es un caso más complicado, porque es una función que se definirá solo en el shell donde workon
o activate
fue corrido.