2

スケジュールに基づいてWindowsサーバーで自動的に実行したいスクリプトをPythonで作成しています。バッチファイルを簡単に操作してみましたが、代わりにPythonスクリプトに熱心に移行し、問題なく動作しています。私が書いたスクリプトは簡単に書くことができ、手動で実行したときに私が望んでいることを正確に実行します。私は今、多くの異なるスクリプトを作成しました。主に、ファイルのコピー、削除、名前の変更、またはディレクトリの移動を扱います。

問題は、Windowsタスクスケジューラを使用してPythonスクリプトをスケジュールしようとすると、それらの多くが実行に失敗することです(タスクスケジューラは「最終実行結果= 0x1」と表示します)。これは常に起こります。バッチファイルでも同様の経験があります(手動で実行できるバッチファイルは、スケジュールされたときに実行できません)。これまでの私の限られた経験を考えると、これは確かにWindowsタスクスケジューラの問題であり、Pythonの問題ではないと言わざるを得ません。

Pythonスクリプトの例を次に示します。

#import modules
import os, shutil, datetime, subprocess

#global variables
zip_dir = 'Y:\7z'
zip_dir_misc = 'X:\7z'
zip_extension = '.7z'

def newest_zip_file(directory, extension = zip_extension): 
  return max(
    (os.path.join(dir_name, file_name)
    for dir_name, dir_names, file_names in os.walk(directory)
    for file_name in file_names
    if file_name.endswith(extension)),
    key=lambda fn: os.stat(fn).st_mtime)  

def copy_zip_file(src_dir_p, temp_dir_p):
  src_file = newest_zip_file(src_dir_p)
  new_file = temp_dir_p + '\\' + os.path.basename(src_file)
  shutil.copyfile(src_file, new_file)

copy_zip_file(zip_dir, zip_dir_misc)

このスクリプトは、ネットワークフォルダー(X:パーティションとして表される)を介して、あるサーバーから別のサーバーに.7zファイルをコピーします。このスクリプトは手動で実行すると機能しますが、スケジュールされている場合は機能しません。ただし、同じ.7zファイルを同じサーバー上の別のディレクトリ(ネットワークフォルダーではない)にコピーするようにスクリプトを変更すると、手動またはスケジュールで実行した場合でも、スクリプトは問題なく機能します。

上記のスクリプトでプログラム的に間違ったことをしている場合(おそらくネットワークフォルダーを不適切に参照している場合)、このスクリプトを一度修正できます(ただし、次のようなものを使用してネットワークフォルダーを定義するために想像できるすべての組み合わせをすでに試しましたが完全なサーバー名)。しかし、同じように動作するまったく異なるPythonスクリプトで同じ問題が発生し続けているため、本当の問題が発生します。

Windowsタスクスケジューラを介して開始したときに、一見有効に見えるPythonスクリプトが実行されないのはなぜですか?

私のWindowsタスクスケジューラの構成:

  • ユーザーがログオンしているかどうかに関係なく実行
  • 最高の特権で実行する
  • 直接呼び出されたアクション(Pythonスクリプト)(プログラムの開始:abc.py)。Python.exeへの引数として送信されませんが、Python.exeアプローチも何度も試しました。どちらのアプローチも(スケジュールされたタスクを実行する限り)他のアプローチよりも優れているとは思わないので、スクリプトを直接呼び出すだけです。

私は主に、この一般的な問題を解決するための提案とベストプラクティスを探していますが、上記のサンプルスクリプトに対する具体的な修正はそれほど多くありません。

4

6 に答える 6

6

ネットワークフォルダについておっしゃっていますが、これはタスクスケジューラの既知の問題です。Pythonでそれを処理するためのヒントについては、この投稿を参照してください。

一般的:

  • タスクスケジューラGUIを介してアクションのスクリプトディレクトリに「開始」プロパティを設定していることを確認してください
  • ディレクトリを含む、スクリプト内の完全なファイル参照を実行します
  • 必要に応じて、認証されたユーザーとしてタスクを実行し、一般設定で「最高の権限で実行」します
  • さまざまな理由から、スクリプトを実行するためにpython.exeを呼び出すバッチファイルとしてタスクを実行する方が幸運な場合があります。
于 2014-08-21T04:26:16.117 に答える
2

私はWindows(またはそのタスクスケジューラ)にあまり精通していませんが、Unixシステムの自動ベースでPythonスクリプトを実行しようとしたときに遭遇する典型的なcronの問題のように聞こえます。

cronの問題の主な理由は、スクリプトが実行される環境とユーザーが異なることです。それらを修正するのが難しい主な理由は、スクリプトが自動的に実行されるときに開発者がエラーメッセージを見逃しているためです。これを修正するには、通常、Pythonスクリプトのすべての出力をエラーログファイルに記録するラッパースクリプトを使用します(失敗後にエラーメッセージを表示できるようにするため)。

通常、元の問題の修正は、Pythonスクリプトの正しい環境(変数など)をセットアップするラッパースクリプトによっても実行できます。

私が言ったように、私の経験はWindowsタスクスケジューラではなくUnix cronに基づいていますが、問題は非常によく似ています。

于 2012-06-21T14:55:31.290 に答える
1

いくつかのメモ:

スケジューラーがPythonファイルの起動に使用しているユーザーのPATHにpythonディレクトリがあることを確認してください。

次に、ユーザーがネットワーク権限も持っていること、およびそのユーザーのマウントも存在することを確認します

第三に、適切なフォルダから起動していることを確認します。スクリプトを変更して.pyファイルが保存されている作業ディレクトリに変更するか、Pythonスクリプトを起動する前に作業ディレクトリに変更される.batファイルを使用して起動することをお勧めします。

于 2012-06-21T15:27:09.467 に答える
1

Windows Server 2012 R2でこの問題が発生し、その背後にある理由を見つけたと思います。タスクの作成時にenvironmnet変数が読み込まれているようです。したがって、独自のモジュールを使用していて、タスクの後にPYTHONPATH変数を設定した場合、タスクは常に新しいPythonモジュールのロードに失敗します。私が見つけた解決策は、単にタスクを再作成し、バッチを使用してPythonスクリプトを起動することです。私のサーバーではそれが機能します、私はそれがあなたのためにトリックをすることを願っています

于 2016-09-26T16:49:51.810 に答える
-1

まず第一に、ウィンドウを適切に設定しない限り、ウィンドウはpythonまたは.pyファイルについて何も知りません。あなたがそれをしていることを確認してください。

次に、完全に最小限のPythonスクリプトでこれを試してください。たとえば、ディレクトリ内のファイルにアクセスするだけのスクリプトです。これにより、スクリプトが実行されているかどうかがわかります。

第三に、これがWindowsの問題であると思われる場合は、スーパーユーザーまたはServerfaultに問い合わせた方がよい場合があります。

于 2012-06-21T15:00:33.603 に答える
-1

私のスクリプトは次のように実行されます。プログラムを起動します:cmd.exe /cc:\Python27\python.exe "c:\ path\script.py"最高の権限で実行します

于 2017-03-28T12:19:22.033 に答える