[英]Python, How should I log errors from multiple subprocesses?
我需要在Python中實現一個“主管”流程,該流程啟動多個子流程並監視其運行。 必須解決的任務之一是記錄由它們生成的錯誤消息。 閱讀該問題后,我找到了以下解決方案:
#!/usr/bin/python
import subprocess
import threading
import time
import logging, logging.handlers
def log_subprocess_output(pipe):
with pipe:
for line in iter(pipe.readline, b''): # b'\n'-separated lines
myLogger.info('got line from subprocess: %r', line)
myLogger.info("Leaving output handler")
myLogger = logging.getLogger('MTEST')
myLogger.setLevel(logging.DEBUG)
myHandler = logging.FileHandler('log.txt')
formatter = logging.Formatter('%(asctime)s %(name)-15s %(levelname)-8s %(message)s')
myHandler.setFormatter(formatter)
myLogger.addHandler(myHandler)
myLogger.info('Test info message')
myLogger.debug('Test debug message')
myLogger.error('Test error message')
npar=[["test1","1.5","10"],
["test2","1.3","20"],
["test3","0.8","30"]]
for pars in npar:
# Let's start the external application
cmd=["./ext.py",]+pars
pd=subprocess.Popen(cmd,stderr=subprocess.PIPE)
# Now we should start the thread (process?) reading the stderr
th=threading.Thread(target=log_subprocess_output,args=(pd.stderr,))
th.start()
外部應用程序在可編程周期內生成可編程數量的人工錯誤消息的情況:
#!/usr/bin/python
import sys
import time
period=float(sys.argv[2])
number=int(sys.argv[3])
for i in range(0,number):
time.sleep(period)
sys.stderr.write(sys.argv[1]+" "+str(i)+'\n')
提出的解決方案工作可靠(我什至已使用該問題中提出的HTTP連接的遠程日志記錄服務器對其進行了測試)。 但是,由於需要混合子進程和線程模塊,我不喜歡它。 是否有更好的解決方案來記錄來自子流程的錯誤消息?
之所以需要線程化,是因為子進程的輸出可以填滿其輸出緩沖區,這將導致其阻塞,從而永遠不會終止,也不會執行其工作。 您的進程可能正在忙於做其他事情,因此您必須啟動一個線程以在后台讀取子進程的輸出,而您的進程還要執行其他工作。
如果子進程在后台運行時沒有有用的工作,您可以調用pd.communicate()
,它讀取輸出(使用線程,但在pd.communicate()
),等待子進程並然后將輸出返回給您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.