タイムアウト付きモジュール「subprocess」の使用 質問する

タイムアウト付きモジュール「subprocess」の使用 質問する

stdout任意のコマンドを実行してそのデータを返すか、ゼロ以外の終了コードで例外を発生させるPython コードを次に示します。

proc = subprocess.Popen(
    cmd,
    stderr=subprocess.STDOUT,  # Merge stdout and stderr
    stdout=subprocess.PIPE,
    shell=True)

communicateプロセスが終了するのを待つために使用されます:

stdoutdata, stderrdata = proc.communicate()

このsubprocessモジュールはタイムアウト (X 秒を超えて実行されているプロセスを強制終了する機能) をサポートしていないため、communicate実行に非常に長い時間がかかる可能性があります。

Windows および Linux で実行することを目的とした Python プログラムでタイムアウトを実装する最も簡単な方法は何ですか?

ベストアンサー1

Python 3.3 以降の場合:

from subprocess import STDOUT, check_output

output = check_output(cmd, stderr=STDOUT, timeout=seconds)

outputコマンドのマージされた stdout、stderr データを含むバイト文字列です。

check_outputメソッドCalledProcessErrorとは異なり、質問のテキストで指定されたゼロ以外の終了ステータスで例外を発生させます。proc.communicate()

不必要に使われることが多いので削除しましたshell=True。必要な場合はいつでも追加し直すことができますcmd。つまりshell=True、子プロセスが独自の子孫を生成する場合、check_output()タイムアウトが示すよりもずっと遅く戻る可能性があります。サブプロセスのタイムアウト失敗

タイムアウト機能はPython 2.xで利用可能で、subprocess323.2+ サブプロセス モジュールのバックポート。

おすすめ記事