web-dev-qa-db-ja.com

Windowsタスクスケジューラから仮想環境でpythonスクリプトを実行する

Windowsタスクスケジューラを使用して、定期的なPythonタスクを設定しようとしています。

'python.exe'へのパスを入力し、スクリプトのパスをパラメーターとしてWindowsタスクスケジューラに提供すると、成功しました(下のスクリーンショットを参照)。

windows task scheduler

ただし、スクリプトを実行する特定の仮想環境を選択できるようにしたいです。私はvenvについてあまり知識がありません。通常、cmdを開き、目的の仮想環境ディレクトリでScripts\activate.batを実行して使用します。

Windowsタスクスケジューラを使用して、「24時間ごとにvenvxxxでタスクxを実行する」を実行するにはどうすればよいですか?

14
deseosuho

次のコマンドを使用してバッチファイルを作成します。

c:\__full_path_to_virtualenv__\Scripts\activate.bat && python __full_path_to_python_script__.py

&& は実行command2ifcommand1を意味します正常に完了しました。

次に、そのバッチファイルを実行するスクリプトとして設定します。タスクスケジューラで追加の引数を設定する必要はありません(または、とにかくバッチファイルで設定できます)。また、スクリプトが特定の場所から読み取り/書き込みを行う必要がある場合は、開始を設定できます。ディレクトリと相対パスを使用します。

13
mx0

上記のmx0による回答は機能しているようですが、起動時にflask Webアプリ)を実行するようにタスクスケジューラを設定しました。この場合、手動での起動は正常に機能しますが、手動での終了は機能しません。終了このタスクは、仮想環境をセットアップするcmd.exeタスクを強制終了しますが、python.exeは引き続き実行されます。

私がうまくいった解決策は このreddit投稿 からでした。これは仮想環境のアクティブ化をスキップしてpython実行可能ファイルを直接呼び出す:

path\to\venv\Scripts\python.exe path\to\script.py

これがどれほど堅牢になるかはわかりませんが、少なくともこの方法でタスクを終了すると、python.exeが終了します。

6
D Sievers

これはより冗長ですが、非常に理解しやすく、スクリプトがたくさんある場合にWindowsタスクスケジューラの設定を使用するよりもはるかに簡単です。別のファイルを作成するには、.batファイルをコピーして1行変更するだけです。

これを.batファイルとして保存し、引数や「開始」を必要とせずに、Actions > Start a Program > Program/Script:の下でポイントします。

set original_dir=%CD%
set venv_root_dir="C:\Python-Venvs\env-name"
cd %venv_root_dir%
call %venv_root_dir%\Scripts\activate.bat

python your_script.py <arg1> <arg2>

call %venv_root_dir%\Scripts\deactivate.bat
cd %original_dir%
exit /B 1

インストールされているコマンドラインプログラムの場合、python your_script.py <arg1> <arg2> ...<program name> <arg1> <arg2> ...に置き換えることができます。

さらに、タスクスケジューラのワンライナーにシーケンシャルスクリプトを解析するのではなく、次の行に別のスクリプトを追加するのは簡単です。

4
Nick P

Mx0の答えを試してみましたが、スクリプトが終了するのに時間がかかりすぎない限り、問題なく動作します。

バッチファイルを使用する代わりに、タスクスケジューラで別のアプローチを使用します。

「プログラム/スクリプト」テキストボックスで、パスをPython実行可能ファイル(私の場合はvirtualenvフォルダー内)に設定します。

"引数を追加" => Pythonスクリプト(name.ppy)の名前だけ。

"Start in" => Pythonスクリプトのフルパス(name.pyなし)。

このようにして、スクリプトが実行され、最後まで待機します。

enter image description here

2
ToCarbajal