web-dev-qa-db-ja.com

pscpを実行するWindowsタスクスケジューラによるpythonスクリプトの実行に関する問題

誰かがこれに遭遇したかどうかはわかりませんが、トラブルシューティングや代替方法の提案をします。

いくつかのスケジュールされたタスクを実行しているWindows2008サーバーがあります。それらのタスクの1つは、pscpを使用してLinuxボックスにログインし、新しいファイルをチェックし、新しいファイルがある場合はそれらをC:ドライブのローカルディレクトリにコピーするpythonスクリプトです。 。重要なポイントでもスクリプトにログインを入れており、logging.basicConfig(level=DEBUG)を使用しています。

変数_command = 'pscp -pw xxxx [email protected]:/ c:\local_dir'_を使用してコマンドを作成し、subprocess.call(command)を使用してコマンドを実行しました。

これが奇妙な部分です。コマンドラインから手動でスクリプトを実行すると、正常に機能します。新しいファイルがダウンロードされ、処理されます。ただし、タスクスケジューラがスクリプトを実行する場合、新しいファイルはダウンロードされません。スクリプトは同じユーザーで実行されていますが、結果は異なります。

スクリプトとLinuxボックスで作成されたログファイルによると、スクリプトはLinuxボックスに正常にログインします。ただし、新しいファイルがあるにもかかわらず、ファイルはダウンロードされません。繰り返しますが、コマンドラインから実行すると、ファイルがダウンロードされます。

何か案は?提案、代替方法?

ありがとう。

9
user1070061

LinuxVMでMSAccessデータベースを開こうとしたときに同じ問題が発生しました。 Windows 7コマンドプロンプトでスクリプトを実行すると機能しましたが、タスクスケジューラで実行すると機能しませんでした。タスクスケジューラを使用すると、データベースを見つけて存在することを確認しますが、データベース内のテーブルは返しません。

解決策は、タスクスケジューラを実行することでしたcmdプログラム/スクリプトとして引数を使用して/ c python C:\ path\to\script.py([引数の追加(オプション)]の下)。

なぜこれが機能するのかはわかりませんが、問題は解決しました。

13
Brad Posthumus

Windowsのタスクスケジューラを使用できますが、[オプション]フィールドの[開始]が入力されていることを確認してください。

タスクスケジューラアプリで、pythonファイルを指定して「doSomeWork」を実行し、ファイルを含むディレクトリを開始(オプション)入力に入力するアクションを追加します。たとえば、 pythonファイルがある場合:

C:\pythonProject\doSomeWork.py

次のように入力します。

Program/Script: doSomeWork.py

Start in (optional): C:\pythonProject 
8
Erkin Djindjiev

同様の問題が発生しています。テストでは、サブプロセスを使用したどのタイプの呼び出しでも、タスクスケジューラで実行するとpythonスクリプトが停止しますが、コマンドラインで実行すると正常に機能することがわかりました。

import subprocess

print('Start')
test = subprocess.check_output(["dir"], Shell=True)
print('First call finished')

コマンドラインで実行すると、次のように出力されます。

Start
First call finished

タスクスケジューラから実行すると、出力は次のようになります。

Start

タスクスケジューラから出力を取得するために、次のようにバッチファイルからpythonスクリプトを実行します。

python test.py >> log.txt

コマンドラインとタスクスケジューラの両方でバッチファイルを介してスクリプトを実行します。

4
Steve

ブラッドの答えは正しいです。サブプロセスが機能するにはシェルコンテキストが必要であり、タスクマネージャーはそれがなくてもpythonを起動できます。これを行う別の方法は、python c:\ path\to\script.pyなどを呼び出すタスクスケジューラによって起動されるバッチファイルを作成することです。これとの唯一の違いは、 os.getcwd()を呼び出すスクリプトでは、常にスクリプトのあるルートを取得しますが、タスクスケジューラからcmdを呼び出すと別のルートを取得します。

1
citizen2191629

バッチファイルを作成し、バッチファイルにpythonスクリプトを追加して、そのバッチファイルをスケジュールします。動作します。例:pythonスクリプトがフォルダーにあるとします。 c:\ abhishek\script\merun.py最初に、cdコマンドでディレクトリに移動する必要があります。バッチファイルは次のようになります。

cd c:\ abhishek\script python merun.py

それは私のために働きます。

0
abhishek

最終編集-開始

実験後... pythonプログラムへのフルパスを配置すると、最高の権限がなくても機能します(管理者として)。次のようなタスク設定を意味します。

program: "C:\Program Files\Python37\python.exe"
arguments: "D:\folder\folder\python script.py"

理由はわかりませんが、スクリプトがサブプロセスと複数のスレッドを使用している場合でも機能します。

最終編集-終了

私がしたことは、タスク設定を変更したことです:Run with highest privilegesをチェックしました。そして、タスクはpython [script path]の実行中に完全に機能し始めました。ただし、そのタイトルには最初に「管理者:」が含まれていることに注意してください...常に...

P.S.サブプロセスが問題であることを指摘してくれてありがとう。タスクの設定を考えさせられました。 1つのスクリプトがWindowsタスクスケジューラから実行されているときに同様の問題が発生しましたが、別のスクリプトは実行されていません。 python [script path]を指定してcmdを実行しても、Windows 8.1 Embeddedx64では機能しませんでした。理由はわかりません。おそらく、パスにスペースを入れて引用符を発行する必要があるためです。私の答えが誰かを助けることを願っています。 ;)