285

cronからDjango管理コマンドを実行しようとしています。プロジェクトをサンドボックス化するためにvirtualenvを使用しています。

私はここや他の場所で、virtualenv内から実行されている管理コマンドを示す例を見てきました。

0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg

ただし、syslogはタスクを開始する必要があるときにエントリを表示しますが、このタスクが実際に実行されることはありません(スクリプトのログファイルは空です)。シェルから手動で行を実行すると、期待どおりに機能します。

現在、コマンドをcron経由で実行できるようにする唯一の方法は、コマンドを分割して、ダムbashラッパースクリプトに配置することです。

#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg

編集:

arsは、コマンドの有効な組み合わせを考え出しました。

0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg

少なくとも私の場合、virtualenvのアクティブ化スクリプトを呼び出しても何も起こりませんでした。これは、ショーでも同様に機能します。

4

16 に答える 16

311

python仮想環境でを使用してこれを実行できるはずです。

/home/my/virtual/bin/python /home/my/project/manage.py command arg

編集:djangoプロジェクトがPYTHONPATHにない場合は、適切なディレクトリに切り替える必要があります。

cd /home/my/project && /home/my/virtual/bin/python ...

cronから失敗をログに記録することもできます。

cd /home/my/project && /home/my/virtual/bin/python /home/my/project/manage.py > /tmp/cronlog.txt 2>&1

manage.pyもう1つ試してみるのは、一番上にあるスクリプトに同じ変更を加えることです。

#!/home/my/virtual/bin/python
于 2010-07-20T04:40:58.723 に答える
117

cronファイルからの実行sourceは、cronが/bin/shサポートしていないデフォルトのシェルとして使用するため機能しませんsource。SHELL環境変数を次のように設定する必要があります/bin/bash

SHELL=/bin/bash
*/10 * * * * root source /path/to/virtualenv/bin/activate && /path/to/build/manage.py some_command > /dev/null

/var/log/syslogエラーの詳細をログに記録しないため、これが失敗する理由を特定するのは難しいです。cronエラーが電子メールで送信されるように、自分自身をrootにエイリアスすることをお勧めします。に自分を追加し/etc/aliasesて実行するだけsendmail -biです。

詳細はこちら: http ://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html

上記のリンクは次のように変更されます: https ://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/

于 2011-08-11T19:33:35.270 に答える
29

これ以上見ないでください:

0 3 * * * /usr/bin/env bash -c 'cd /home/user/project && source /home/user/project/env/bin/activate && ./manage.py command arg' > /dev/null 2>&1

一般的なアプローチ:

* * * * * /usr/bin/env bash -c 'YOUR_COMMAND_HERE' > /dev/null 2>&1

SHELLこれの利点は、crontabの変数をからshに変更する必要がないことです。bash

于 2018-05-27T21:32:19.380 に答える
17

virtualenvを使用するときにpythoncronジョブを実行する唯一の正しい方法は、環境をアクティブ化してから、環境のpythonを実行してコードを実行することです。

activate_thisこれを行う1つの方法は、Pythonスクリプトでvirtualenvを使用することです。http : //virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonを参照してください。

別の解決策は、環境のアクティブ化とそれをにパイプすることを含む完全なコマンドをエコーすること/bin/bashです。あなたのためにこれを考慮してください/etc/crontab

***** root echo 'source /env/bin/activate; python /your/script' | /bin/bash
于 2014-03-28T23:02:35.443 に答える
10

virtualenv固有のシバンをいじくり回すのではなくPATH、crontabの前に追加するだけです。

アクティブ化されたvirtualenvから、次の3つのコマンドを実行すると、Pythonスクリプトが正常に機能するはずです。

$ echo "PATH=$PATH" > myserver.cron
$ crontab -l >> myserver.cron
$ crontab myserver.cron

crontabの最初の行は次のようになります。

PATH=/home/me/virtualenv/bin:/usr/bin:/bin:  # [etc...]
于 2012-12-12T04:42:01.160 に答える
7

そのn番目の答えをお詫びしますが、私は答えをチェックしました、そして本当にもっと単純できれいです。

短編小説

cronでvenvのpythonバイナリを使用します。

0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py 

長い話

その特定の仮想環境(つまり、そのバイナリとモジュール)のPython構成を使用して現在のシェルを設定する場合は、仮想環境をアクティブ化します。
現在のシェルでの作業に関連しています。venvの完全なPythonパスを参照する必要なしに、現在のシェルで複数のPythonコマンドを実行します。
cronまたはbashのフレームで、環境をアクティブ化するための値はどれですか?それに加えて、Pythonコードを呼び出すラッパーを定義するのbashではなく、またはまだ定義するためのいくつかの参照をいくつかの回答で読みました。shしかし、なぜ私たちはこれらを気にする必要がありますか?

私は繰り返します、ただそれをしてください:

0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py 

ドキュメントはそれを確認します:

特に環境をアクティブ化する必要はありません。アクティベーションは、仮想環境のバイナリディレクトリをパスの前に追加するだけなので、「python」は仮想環境のPythonインタープリターを呼び出し、インストールされたスクリプトをフルパスを使用せずに実行できます。ただし、仮想環境にインストールされているすべてのスクリプトは、アクティブ化せずに実行可能であり、仮想環境のPythonで自動的に実行される必要があります。

于 2021-09-22T09:37:08.827 に答える
4

私にとって最善の解決策は、両方を行うことでした

  • venvbin/ディレクトリにあるpythonバイナリを使用します
  • venvモジュールディレクトリを含むようにPythonパスを設定します。

man pythonシェル$PYTHONPATHまたはPythonでパスを変更することに言及していますsys.path

他の回答は、シェルを使用してこれを行うためのアイデアに言及しています。Pythonから、スクリプトに次の行を追加すると、cronから直接スクリプトを正常に実行できます。

import sys
sys.path.insert(0,'/path/to/venv/lib/python3.3/site-packages');

インタラクティブセッションでの外観は次のとおりです-

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
[GCC 4.8.1] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import sys

>>> sys.path
['', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-x86_64-linux-gnu', '/usr/lib/python3.3/lib-dynload']

>>> import requests
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'requests'   

>>> sys.path.insert(0,'/path/to/venv/modules/');

>>> import requests
>>>
于 2014-04-25T08:00:09.437 に答える
4

問題の解決に時間を費やし、cronとvirtualenvでの変数の使用法の組み合わせについて、ここで答えが見つからなかったため、これを追加したいと思います。だから多分それは誰かを助けるでしょう。

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DIR_SMTH="cd /smth"
VENV=". venv/bin/activate"
CMD="some_python_bin do_something"
# m h  dom mon dow   command
0 * * * * $DIR_SMTH && $VENV && $CMD -k2 some_target >> /tmp/crontest.log 2>&1

次のように構成されているとうまく機能しませんでした

DIR_SMTH = "cd /smth&&。venv/bin / activate"

正しい方向を示してくれた@ davidwinterbottom@ reed-sandberg、 @mkbに感謝します。受け入れられた答えは、Pythonがvenv / binディレクトリから別のPythonバイナリを実行する必要があるスクリプトを実行する必要があるまで、実際には正常に機能します。

于 2018-08-08T15:26:50.230 に答える
3

これは、crontabコマンドを通常のコマンド(Ubuntu 18.04でテスト済み)と非常によく似たものにする簡単な方法です。覚えておくべきいくつかの重要な注意事項:

  • .の代わりにコマンドを使用できますsource。(crontabはshデフォルトでではなくbashを使用するため、ありませんsource。)
  • ~$variablescrontabコマンドで展開されます。(変数展開を行わないのはcrontab環境ステートメントのみです。)

ファイルがある場合の例を次に示します~/myproject/main.py

* * * * * cd ~/myproject && . .venv/bin/activate && python main.py > /tmp/out1 2>&1

venvディレクトリ内のの特定のパスを直接呼び出すこともできます。pythonその場合は、を呼び出す必要はありませんactivate

* * * * * ~/myproject/.venv/bin/python ~/myproject/main.py > /tmp/out2 2>&1

その欠点は、プロジェクトパスを2回指定する必要があるため、メンテナンスが難しくなることです。これを回避するには、シェル変数を使用して、プロジェクトパスを1回だけ指定することができます。

* * * * * project_dir=~/myproject ; $project_dir/.venv/bin/python $project_dir/main.py > /tmp/out3 2>&1
于 2021-09-02T23:04:28.737 に答える
2

Pythonを使用していて、Pythonスクリプトにシバン#!/ usr / bin / env pythonが含まれているConda仮想環境を使用している場合、次のように機能します。

* * * * * cd /home/user/project && /home/user/anaconda3/envs/envname/bin/python script.py 2>&1

さらに、スクリプト内の出力(印刷、エラーなど)をキャプチャする場合は、次を使用できます。

* * * * * cd /home/user/project && /home/user/anaconda3/envs/envname/bin/python script.py >> /home/user/folder/script_name.log 2>&1
于 2020-10-21T19:47:41.993 に答える
1

Pythonスクリプト

from datetime import datetime                                                                                                                                                                
import boto   # check wheather its taking the virtualenv or not                                                                                                                                                                        
import sys                                                                                                                                                                                   
param1=sys.argv[1]     #Param                                                                                                                                                                                                                                                                                                                                                                    
myFile = open('appendtxt.txt', 'a')                                                                                                                                                      
myFile.write('\nAccessed on ' + param1+str(datetime.now())) 

cronコマンド

 */1 * * * *  cd /Workspace/testcron/ && /Workspace/testcron/venvcron/bin/python3  /Workspace/testcron/testcronwithparam.py param  

上記のコマンドで

  • * / 1 * ***-1分ごとに実行
  • cd / Workspace /testcron/-Pythonスクリプトのパス
  • / Workspace / testcron / venvcron / bin/python3 -Virtualenvパス
  • Workspace / testcron/testcronwithparam.py-ファイルパス
  • param-パラメータ
于 2020-05-11T10:29:54.510 に答える
1

Djangoプロジェクト内に次のスクリプトを追加しました。このスクリプトはmanage.sh、virtualenvを取得し、manage.py渡した引数を使用してスクリプトを実行します。一般に、virtualenv内でコマンドを実行するのは非常に簡単です(cron、systemdユニット、基本的にどこでも):

#! /bin/bash

# this is a convenience script that first sources the venv (assumed to be in
# ../venv) and then executes manage.py with whatever arguments you supply the
# script with. this is useful if you need to execute the manage.py from
# somewhere where the venv isn't sourced (e.g. system scripts)

# get the script's location
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# source venv <- UPDATE THE PATH HERE WITH YOUR VENV's PATH
source $DIR/../venv/bin/activate

# run manage.py script
$DIR/manage.py "$@"

次に、cronエントリで次のコマンドを実行できます。

0 3 * * * /home/user/project/manage.sh command arg

manage.shスクリプトを実行可能にする必要があることを覚えておいてください

于 2021-01-14T09:30:00.430 に答える
0

cronは独自の最小限のsh環境で実行されるため、仮想環境でPythonスクリプトを実行するために私が行うことは次のとおりです。

* * * * * . ~/.bash_profile; . ~/path/to/venv/bin/activate; python ~/path/to/script.py

(注:うまく. ~/.bash_profileいかない場合は、サーバーの設定方法に応じて試してみてください。. ~/.bashrc. ~/.profile

これにより、シェル環境が読み込まbashれ、Python仮想環境がアクティブ化されます。基本的に、スクリプトをテストしたときと同じセットアップが残ります。

crontabで環境変数を定義したり、既存のスクリプトを変更したりする必要はありません。

于 2021-01-31T11:01:15.417 に答える
-1

これは私にとってうまくいった解決策です。

source /root/miniconda3/etc/profile.d/conda.sh && \
conda activate <your_env> && \
python <your_application> &

Ubuntu18.04.3LTSでCondaバージョン4.7.12のminicondaを使用しています。

上記をスクリプト内に配置し、crontabを介して問題なく実行することができます。

于 2020-03-14T23:29:14.630 に答える
-1

これはcrontab-eでも機能します

* */5 * * * cd /home/project && sudo /home/project/venv/bin/python scripte.py
于 2021-03-04T16:13:07.950 に答える
-1

私はこれと同じ問題を抱えていました:

geodjangoポリゴン内のgeodjango位置座標をチェックするカスタムdjangoコマンドを作成し、実行するタスクを自動化するのに問題がありましたが、crontabでこのコマンドを使用するとうまくいきました:

* * * * * ./home/project/locations/locations.sh >> /var/log/locations.log 2>&1
于 2021-05-10T19:40:06.123 に答える