Python でプロセス出力を停止するときに Readline のハングを回避するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-10-30 08:44:02
オリジナル
344 人が閲覧しました

How to Avoid Readline Hangs When Stopping Process Output in Python?

Python でのプロセス出力停止時の Readline ハングの回避

問題の説明:

os.popen を使用した Python プログラム内() または subprocess.Popen() を使用して継続的に更新されるプロセス (top など) の出力を読み取ると、readlines() を使用してすべての行を読み取ろうとするとプログラムがハングする可能性があります。

解決策:

一時ファイルと子プロセスの使用:

<code class="python">import subprocess
import tempfile
import time

def main():
    # Open a temporary file for process output
    with tempfile.TemporaryFile() as f:
        # Start the process and redirect its stdout to the file
        process = subprocess.Popen(["top"], stdout=f)

        # Wait for a specified amount of time
        time.sleep(2)

        # Kill the process
        process.terminate()
        process.wait()  # Wait for the process to terminate to ensure complete output

        # Seek to the beginning of the file and print its contents
        f.seek(0)
        print(f.read())

if __name__ == "__main__":
    main()</code>
ログイン後にコピー

このアプローチでは、一時ファイルを使用してプロセス出力を保存し、プログラムが readlines() でのブロックを回避できるようにします。

代替解決策:

別のスレッドでキューを使用する:

<code class="python">import collections
import subprocess
import threading

def main():
    # Create a queue to store process output
    q = collections.deque()

    # Start the process and redirect its stdout to a thread
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE)
    t = threading.Thread(target=process.stdout.readline, args=(q.append,))
    t.daemon = True
    t.start()

    # Wait for a specified amount of time
    time.sleep(2)

    # Terminate the process
    process.terminate()
    t.join()  # Wait for the thread to finish

    # Print the stored output
    print(''.join(q))

if __name__ == "__main__":
    main()</code>
ログイン後にコピー

signal.alarm() を使用する:

<code class="python">import collections
import signal
import subprocess

class Alarm(Exception):
    pass

def alarm_handler(signum, frame):
    raise Alarm

def main():
    # Create a queue to store process output
    q = collections.deque()

    # Register a signal handler to handle alarm
    signal.signal(signal.SIGALRM, alarm_handler)

    # Start the process and redirect its stdout
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

    # Set an alarm to terminate the process after a specified amount of time
    signal.alarm(2)

    # Read lines until the alarm is raised or the process terminates
    try:
        while True:
            line = process.stdout.readline()
            if not line:
                break
            q.append(line)
    except Alarm:
        process.terminate()

    # Cancel the alarm if it hasn't already fired
    signal.alarm(0)

    # Wait for the process to finish
    process.wait()

    # Print the stored output
    print(''.join(q))

if __name__ == "__main__":
    main()</code>
ログイン後にコピー

これらの代替案を使用すると、プロセス出力を保存しながらプログラムの実行を継続できます。これらは、プロセス出力を継続的に監視する必要がある場合に適している可能性があります。

以上がPython でプロセス出力を停止するときに Readline のハングを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート