2010-11-11 13 views
61

Quiero configurar un crontab para ejecutar un script de Python.¿Cómo establecer virtualenv para un crontab?

Diga el guión es algo así como:

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

¿Hay alguna manera de que pudiera especificar un virtualenv para esa secuencia de comandos de Python para ejecutar en? Con cáscara que acababa de hacer:

~$ workon myenv 

¿Hay algo equivalente a lo que podía hacer en el crontab para activar un virtualenv?

Respuesta

73

Si está utilizando "workon", en realidad está usando "envoltorio virtualenv", que es otra capa de abstracción que se sienta encima de virtualenv. virtualenv el único que puede ser activado por cd'ing a su directorio raíz virtualenv y en ejecución:

source bin/activate 

workon es un comando proporcionado por virtualenv envoltorio, no virtualenv, y lo hace un poco de materia adicional que no se requiere necesariamente para virtualenv llanura . Todo lo que necesita hacer es generar el archivo bin/activate en su directorio raíz de virtualenv para "activar" un virtualenv.

Usted 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 
+1

¿Debo seguir usando "#!/Usr/bin/python" para especificar mi intérprete de Python en mi script? Pero mi virtualenv podría apuntar a un intérprete diferente. Aquí es donde estoy confundido. – Continuation

+7

Es posible que desee echar un vistazo a lo que bin/activate está haciendo. Activar un virtualenv básicamente es simplemente modificar su entorno de ruta para apuntar a versiones específicas de comandos, como Python, etc. Si activa un virtualenv, entonces intente ejecutar/usr/bin/python, puede o no estar usando la versión de pitón que su virtualenv está esperando. En lugar de hacer "#!/Usr/bin/python", puede hacer "#!/Usr/bin/env python" para que el env decida qué python ejecutar, según su RUTA. –

+14

Al igual que un aviso, no intente 'source' en su línea cron, ya que es un bashismo y no funcionará, ya que cron usará'/bin/sh' para ejecutar su comando. –

81

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

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

Yo prefiero usar Python directamente desde el virtualenv ...

+4

Esto funciona muy bien. De hecho, también es posible poner la ruta absoluta al intérprete de Python en el shebang (también conocido como #!) Del propio script y, por supuesto, hacer que el script sea ejecutable. –

+0

@AvinashMeetoo Sí, es posible, pero de esta manera se convierte en location- and setup-dependan – Pijusn

+5

Intenté esto y descubrí que mi script no podía importar desde otros módulos en el mismo proyecto. ¿Alguna idea de por qué podría suceder eso? –

8

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

virt_env_wrapper.bash:

#!/bin/bash  
source path/to/virtual/env/bin/activate 
"[email protected]" 

de Bash encantamiento mágico "[email protected]" re-escapes todas las fichas en la línea de comandos original, de modo que si se va a invocar:

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

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