0

Python サブプロセスと実行中の stdout の読み取りに関連する質問と回答が多数ありますが、これらの要件を満たす解決策はまだ見つかりません。

  • サブプロセスを開始する
  • ファイルへの書き込みなど、他の処理を実行しながら、stdout を端末に出力します。
  • ファイルへの書き込みなど、他の処理を実行しながら、stderr を端末に出力します。
  • stdout と stderr は別々に処理する必要があります
  • 出力がエラーを示している場合、または何らかのタイムアウトが原因である場合のプロセスの終了
  • Linux をサポートする必要があり、可能であれば Windows (XP/7) もサポートする必要があります。

障害の 1 つは、たとえば、実行中のプロセスによって stdout データが生成されない場合、プロセス stdout.read() および stdout.readline() がブロックされ、タイムアウトによるプロセス kill() の終了が妨げられることです。

開始のためのコード:

# Python 3.3 syntax

import sys
import subprocess

def subproc(args, stdout):
    proc = subprocess.Popen(args, stdout=subprocess.PIPE, shell=False, universal_newlines=True)
    while True:  # while is broken by return 
        try:
            outs = ''  # Clear before communication attempt
            outs = proc.communicate(timeout=1)[0]  # Timeout every second to process stdout
        except subprocess.TimeoutExpired:
            pass
        # Processing termination using proc.kill is added later
        sys.__stdout__.write('Shows that proc communicate timeout works\n')
        if outs:
            stdout.write(outs)  # Allow stdout processing
        if proc.returncode is not None:  # Completed execution
            return proc.returncode  # End while and return

class StdHandle:
    def write(self, str):
        # Additional processing ...
        sys.__stdout__.write(str)
    def flush(self):
        pass

rc = subproc(('proc.sh'), stdout=StdHandle())
print('Return code:', rc)

# EOF
4

0 に答える 0