Как установить virtualenv для crontab? - PullRequest
67 голосов
/ 11 ноября 2010

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

Скажите, что сценарий похож на

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

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

~$ workon myenv

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

Ответы [ 3 ]

93 голосов
/ 12 октября 2012

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

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

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

79 голосов
/ 11 ноября 2010

Если вы используете «workon», вы на самом деле используете «оболочку virtualenv», которая является еще одним уровнем абстракции, который находится на вершине virtualenv. Только virtualenv можно активировать, перейдя в ваш корневой каталог virtualenv и выполнив команду:

source bin/activate

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

Вы можете настроить свой 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
8 голосов
/ 13 мая 2015

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

virt_env_wrapper.bash:

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

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

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

...