Je veux mettre en place une crontab pour exécuter un script Python.
Disons que le script est quelque chose comme:
#!/usr/bin/python
print "hello world"
Existe-t-il un moyen de spécifier un virtualenv pour ce script Python à exécuter? Dans Shell, je ferais simplement:
~$ workon myenv
Y a-t-il quelque chose d'équivalent que je pourrais faire dans crontab pour activer un virtualenv?
Si vous utilisez "workon", vous utilisez en fait "wrapper virtualenv" qui est une autre couche d'abstraction qui se trouve au-dessus de virtualenv. virtualenv seul peut être activé en cd'ing dans votre répertoire racine virtualenv et en exécutant:
source bin/activate
workon est une commande fournie par wrapper virtualenv, pas virtualenv, et il fait des choses supplémentaires qui ne sont pas nécessairement nécessaires pour virtualenv ordinaire. Tout ce que vous avez vraiment besoin de faire est de source le fichier bin/activate dans votre répertoire racine virtualenv pour "activer" un virtualenv.
Vous pouvez configurer votre crontab pour appeler un script bash qui fait ceci:
#! /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
Une autre solution qui fonctionne bien pour moi ...
0 9 * * * /path/to/virtenv/bin/python /path/to/cron_script.py
Je préfère utiliser python directement à partir de virtualenv ...
Avec bash, vous pouvez créer un wrapper env virtuel générique que vous pouvez utiliser pour invoquer n'importe quelle commande , un peu comme la façon dont time
peut encapsuler n'importe quelle commande.
virt_env_wrapper.bash
:#!/bin/bash
source path/to/virtual/env/bin/activate
"$@"
L'incantation magique de Bash "$@"
rééchappe tous les jetons sur la ligne de commande d'origine de sorte que si vous deviez invoquer:
virt_env_wrapper.bash python foo.py bar 'baz blap'
foo.py
verrait un sys.argv
de ['bar', 'baz blap']