Как установить virtualenv для crontab?


Я хочу настроить crontab для запуска скрипта Python.

скажем скрипт что-то вроде:

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

есть ли способ указать virtualenv для этого скрипта Python для запуска? В shell я бы просто сделал:

~$ workon myenv

есть ли что-то эквивалентное, что я мог бы сделать в crontab для активации virtualenv?

3 63

3 ответа:

Если вы используете "работу" вы на самом деле использовать "обертку виртуальное окружение", которое представляет собой еще один уровень абстракции, который сидит на вершине виртуальное окружение. только virtualenv можно активировать с помощью cd'ING в корневой каталог virtualenv и запустить:

source bin/activate

workon-это команда, предоставляемая оболочкой virtualenv, а не virtualenv, и она делает некоторые дополнительные вещи, которые не обязательно требуются для простого virtualenv. Все, что вам действительно нужно сделать, это источник файла bin / activate в вашем корневой каталог виртуального окружения, чтобы "включить" виртуальное окружение.

вы можете настроить свой crontab для вызова скрипта bash, который делает это:

#! /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

еще одно решение, которое хорошо работает для меня...

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

Я предпочитаю использовать python непосредственно из virtualenv...

С помощью bash вы можете создать универсальную виртуальную оболочку env, которую можно использовать для вызова любой, как time может обернуть любую команду.

virt_env_wrapper.bash:

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

магическое заклинание Баша "$@" повторно экранирует все маркеры в исходной командной строке, чтобы при вызове:

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

foo.py видим sys.argv на ['bar', 'baz blap']