Cómo configurar virtualenv para un crontab?


Quiero configurar un crontab para ejecutar un script Python.

Digamos que el script es algo así como:

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

¿Hay alguna forma de especificar un virtualenv para que se ejecute el script Python? En shell solo haría:

~$ workon myenv

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

Author: Braiam, 2010-11-11

3 answers

Si estás usando "workon" en realidad estás usando "virtualenv wrapper" que es otra capa de abstracción que se encuentra encima de virtualenv. virtualenv solo puede ser activado por cd'ing a su directorio raíz virtualenv y ejecutando:

source bin/activate

Workon es un comando proporcionado por virtualenv wrapper, no virtualenv, y hace algunas cosas adicionales que no se requieren necesariamente para virtualenv llano. Todo lo que realmente necesita hacer es obtener el archivo bin / activate en su raíz virtualenv directorio para" activar " un virtualenv.

Puede configurar su crontab para invocar un script bash que haga 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
 77
Author: Andy White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-30 23:10:21

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 virtualenv...

 86
Author: Mike Pennington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-11 10:06:38

Con bash, puede crear una envoltura env virtual genérica que puede usar para invocar cualquiera comando, al igual que cómo time puede envolver cualquier comando.

virt_env_wrapper.bash:

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

El conjuro mágico de Bash "$@" vuelve a escapar todos los tokens de la línea de comandos original de modo que si invocaras:

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

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

 8
Author: Ross Rogers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 14:10:33