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

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

Скажем, что script это что-то вроде:

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

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

~$ workon myenv

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

Ответ 1

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

source bin/activate

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

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

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

Ответ 2

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

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

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

Ответ 3

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

virt_env_wrapper.bash:

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

Bash магическое заклинание "[email protected]" повторно выталкивает все токены в исходной командной строке, чтобы при вызове:

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

foo.py увидит sys.argv of ['bar', 'baz blap']