web-dev-qa-db-ja.com

crontabにvirtualenvを設定する方法は?

Pythonスクリプトを実行するためにcrontabをセットアップしたい。

スクリプトは次のようなものだとしましょう:

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

Pythonスクリプトを実行するためのvirtualenvを指定する方法はありますか?シェルでは次のようにします。

~$ workon myenv

Virtualenvをアクティブにするためにcrontabでできることと同等のものはありますか?

67
Continuation

「workon」を使用している場合、実際には「virtualenv wrapper」を使用しています。これは、virtualenvの上にある別の抽象化層です。 virtualenvのみをアクティブにするには、virtualenvルートディレクトリにcdして、次を実行します。

source bin/activate

workonは、virtualenvではなく、virtualenvラッパーによって提供されるコマンドであり、プレーンなvirtualenvに必ずしも必要ではない追加機能を実行します。本当に必要なのは、virtualenvルートディレクトリのbin/activateファイルをソースとして、virtualenvを「アクティブ化」することだけです。

これを行うbashスクリプトを呼び出すようにcrontabをセットアップできます。

#! /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
79
Andy White

私にとってうまくいく別のソリューション...

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

私はvirtualenvから直接pythonを使用することを好む...

94
Mike Pennington

Bashを使用すると、 any コマンドを呼び出すために使用できる汎用仮想環境ラッパーを作成できます。 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.pysys.argv of ['bar', 'baz blap']

8
Ross Rogers