ハングせずに Python でのプロセス出力の読み取りを停止する
os.popen() を使用してプロセス出力をキャプチャする場合、プログラムは次の場合にハングする可能性があります。プロセスは継続的にデータを出力します。この問題に対処するには、次のような代替方法の使用を検討してください。
サブプロセスとスレッドの使用
subprocess.Popen でプロセスを開始し、出力を読み取るスレッドを作成します。そしてそれをキューに保存します。特定のタイムアウト後にプロセスを終了します。
<code class="python">import subprocess import threading import time def read_output(process, append): for line in iter(process.stdout.readline, ""): append(line) def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) try: q = collections.deque(maxlen=200) t = threading.Thread(target=read_output, args=(process, q.append)) t.daemon = True t.start() time.sleep(2) finally: process.terminate() print(''.join(q))</code>
シグナル ハンドラーの使用
指定したタイムアウト後に例外を発生させるには signal.alarm() を使用します。これにより、プロセスが強制的に終了し、出力をキャプチャできるようになります。
<code class="python">import signal import subprocess import time def alarm_handler(signum, frame): raise Alarm def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(2) q = collections.deque(maxlen=200) try: for line in iter(process.stdout.readline, ""): q.append(line) signal.alarm(0) except Alarm: process.terminate() finally: print(''.join(q))</code>
タイマーの使用
タイムアウト後にプロセスを終了するには、threading.Timer を使用します。
<code class="python">import threading import subprocess def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) timer = threading.Timer(2, process.terminate) timer.start() q = collections.deque(process.stdout, maxlen=200) timer.cancel() print(''.join(q))</code>
代替アプローチ
これらのソリューションでは、さらに複雑さや互換性の問題が発生する可能性があることに注意してください。特定のニーズとプラットフォームに最適なアプローチを選択してください。
以上が継続的なプロセス出力をキャプチャするときに Python プログラムがハングしないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。