캡처 출력 및 백그라운드에서 실행 threading
이 답변 에서 언급했듯이 출력을 캡처 stdout=
한 다음 시도 read()
하면 프로세스가 차단됩니다.
그러나 이것이 필요한 경우가 있습니다. 예를 들어, 두 포트 사이에서 통신하는 두 개의 프로세스 를 시작 하고 stdout을 로그 파일과 stdout에 저장하려고했습니다.
threading
모듈은 우리가 그렇게 할 수 있습니다.
먼저이 질문에서 출력 리디렉션 부분을 단독으로 수행하는 방법을 살펴보십시오 .Python Popen : stdout 및 log 파일에 동시에 쓰기
그때:
main.py
#!/usr/bin/env python3
import os
import subprocess
import sys
import threading
def output_reader(proc, file):
while True:
byte = proc.stdout.read(1)
if byte:
sys.stdout.buffer.write(byte)
sys.stdout.flush()
file.buffer.write(byte)
else:
break
with subprocess.Popen(['./sleep.py', '0'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc1, \
subprocess.Popen(['./sleep.py', '10'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc2, \
open('log1.log', 'w') as file1, \
open('log2.log', 'w') as file2:
t1 = threading.Thread(target=output_reader, args=(proc1, file1))
t2 = threading.Thread(target=output_reader, args=(proc2, file2))
t1.start()
t2.start()
t1.join()
t2.join()
sleep.py
#!/usr/bin/env python3
import sys
import time
for i in range(4):
print(i + int(sys.argv[1]))
sys.stdout.flush()
time.sleep(0.5)
실행 후 :
./main.py
stdout은 두 줄마다 다음을 포함하기 위해 0.5 초마다 업데이트됩니다.
0
10
1
11
2
12
3
13
각 로그 파일에는 지정된 프로세스에 대한 해당 로그가 포함됩니다.
고무시키는 : https://eli.thegreenplace.net/2017/interacting-with-a-long-running-child-process-in-python/
Ubuntu 18.04, Python 3.6.7에서 테스트되었습니다.