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