python cron virtualenv virtualenvwrapper

python - ¿Cómo establecer virtualenv para un crontab?



virtualenvwrapper (3)

Con bash, puede crear un envoltorio de env virtual genérico que puede usar para invocar cualquier comando, al igual que el time puede envolver cualquier comando.

virt_env_wrapper.bash :

#!/bin/bash source path/to/virtual/env/bin/activate "$@"

El encantamiento mágico de Bash "$@" re-escapa todos los tokens en la línea de comando original, de modo que si invocases:

virt_env_wrapper.bash python foo.py bar ''baz blap''

foo.py vería un sys.argv de [''bar'', ''baz blap'']

Quiero configurar un crontab para ejecutar un script de Python.

Digamos que el script es algo así como:

#!/usr/bin/python print "hello world"

¿Hay alguna manera de que pueda especificar un virtualenv para ejecutar esa secuencia de comandos de Python? En el caparazón que acaba de hacer:

~$ workon myenv

¿Hay algo equivalente que pueda hacer en crontab para activar un virtualenv?


Otra solución que funciona bien para mí ...

0 9 * * * /path/to/virtenv/bin/python /path/to/cron_script.py

Prefiero usar Python directamente desde el virtualenv ...


Si está utilizando "workon", en realidad está usando "virtualenv wrapper", que es otra capa de abstracción que se sienta encima de virtualenv. virtualenv solo se puede activar al hacer una copia en el directorio raíz de virtualenv y ejecutar:

source bin/activate

workon es un comando provisto por virtualenv wrapper, no virtualenv, y hace algunas cosas adicionales que no son necesariamente necesarias para virtualenv simple. Todo lo que necesita hacer es generar el archivo bin / activate en su directorio raíz de virtualenv para "activar" un virtualenv.

Puede configurar su crontab para invocar un script bash que hace esto:

#! /bin/bash cd my/virtual/env/root/dir source bin/activate # virtualenv is now active, which means your PATH has been modified. # Don''t try to run python from /usr/bin/python, just run "python" and # let the PATH figure out which version to run (based on what your # virtualenv has configured). python myScript.py