作者:zh1234之歌 | 来源:互联网 | 2023-09-24 09:10
如果使用子进程调用此程序,则从程序的记录器获取消息时出现问题.
这是程序BooFoo.py,它使用记录器将消息打印到文件和控制台窗口:
import logging
LOG_FILENAME = 'example.log'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
logger = logging.getLogger('main')
logger.addHandler(logging.StreamHandler())
print 'print foo'
logger.info('logger boo')
这是程序CallBooFoo.py:
import subprocess
proc = subprocess.Popen(['python BooFoo.py'], bufsize=512, stdin = None,
stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True)
proc_out, proc_err = proc.communicate()
print proc_out
使用CallBooFoo.py打印“logger boo”.知道如何解决这个问题吗?使用os.system工作,但由于其他一些原因不是解决方案.
解决方法:
logging.StreamHandler默认写入标准错误,而不是标准输出.您可以使用logging.StreamHandler(sys.stdout)将其更改为标准输出.
您也可以保持代码不变,并在调用进程中打印proc_err的值而不是proc_out(或者除此之外).这将显示子进程的标准错误.
如果需要将stdout和stderr混合在一起,可以将调用进程更改为:
proc = subprocess.Popen(['python BooFoo.py'], bufsize=512, stdin = None,
stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell=True)
proc_out, proc_err = proc.communicate()
print proc_out