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で利用可能で、subprocess32
3.2+ サブプロセス モジュールのバックポート。