ホームページ >バックエンド開発 >Python チュートリアル >Python の「subprocess」モジュールを使用するときにタイムアウトを実装するにはどうすればよいですか?

Python の「subprocess」モジュールを使用するときにタイムアウトを実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-17 17:57:11268ブラウズ

How Can I Implement Timeouts When Using Python's `subprocess` Module?

Python のサブプロセス モジュールとタイムアウト

サブプロセス モジュールは、外部コマンドを実行し、その出力をキャプチャし、そのライフサイクルを管理する便利な方法を提供します。ただし、デフォルトでは、その communication() メソッドはタイムアウトをサポートしません。これにより、実行時間の長いコマンドを実行するときに、呼び出しプロセスがデッドロックになる可能性があるという課題が生じます。

check_output を使用したタイムアウトの実装

Python 3.3 以降では、check_output() がPopen() および communication() のより効率的な代替手段。この関数はコマンドを評価し、その stdout 出力と stderr 出力をバイト文字列にマージし、コマンドがゼロ以外のステータスで終了した場合は CalledProcessError を発生させます。重要なのは、タイムアウトもサポートしているため、コマンドの最大実行時間を指定できることです。

from subprocess import STDOUT, check_output

seconds = 10  # Timeout in seconds
output = check_output(cmd, stderr=STDOUT, timeout=seconds)

この例では、check_output() 関数は cmd で指定されたコマンドを実行し、完了するまで待機します。 10秒以内に。コマンドに 10 秒以上かかる場合、TimeoutExpired エラーが発生します。

Python 2.x でのタイムアウトに subprocess32 を使用する

Python 2.x の場合、 subprocess32 バックポートは、Python 3.3 の check_output() と同じタイムアウト機能を提供します。 subprocess32 をインストールするには、pip を使用します:

pip install subprocess32

インストールしたら、subprocess32 の call() 関数を使用してタイムアウト付きでコマンドを実行できます:

import subprocess32

seconds = 10  # Timeout in seconds
subprocess32.call(cmd, timeout=seconds)

追加の考慮事項

  • サブプロセスからshell=Trueを削除します可能な場合は電話をかけます。これにより、セキュリティとパフォーマンスが向上します。
  • タイムアウトの動作は、プラットフォームとプロセスの複雑さによって異なる場合があります。詳細については、サブプロセスのタイムアウト障害に関するドキュメントを参照してください。

以上がPython の「subprocess」モジュールを使用するときにタイムアウトを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。