1. ホーム
  2. パイソン

[解決済み】タイムアウトを伴うモジュール「subprocess」の使用について

2022-03-25 05:52:30

質問

以下は、任意のコマンドを実行して、そのコマンドの stdout のデータ、またはゼロ以外の終了コードで例外を発生させます。

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のプログラムでタイムアウトを実装する方法は?

どのように解決するのですか?

Python 3.3+の場合。

from subprocess import STDOUT, check_output

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

output は、コマンドのマージされた標準出力、標準エラーデータを含むバイト文字列です。

check_output レイズ CalledProcessError とは異なり、質問のテキストで指定されたゼロでない終了ステータスで proc.communicate() メソッドを使用します。

を削除しました。 shell=True は不必要に使われることが多いからです。以下のような場合は、いつでも元に戻すことができます。 cmd は本当に必要です。もし shell=True すなわち、子プロセスが自身の子孫を産み出す場合。 check_output() はタイムアウトが示すよりもずっと後に戻ることができる。 サブプロセスタイムアウトの失敗 .

タイムアウト機能は、Python 2.x では subprocess32 3.2+ subprocess モジュールのバックポートです。