【发布时间】:2018-05-17 07:54:44
【问题描述】:
搜索后,我定义了一个函数来执行终端中的命令:
import shlex
import subprocess
def execute_cmd(cmd):
p = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(p.stdout.readline, b''): # b'' here for python3
sys.stdout.write(line.decode(sys.stdout.encoding))
error = p.stderr.read().decode()
if error:
raise Exception(error)
它工作正常(输出是实时的),当我
execute_cmd('ping -c 5 www.google.com')
但是,当我使用execute_cmd 运行 python 脚本时,输出将打印出来,直到该过程完成。
execute_cmd('python test.py')
脚本:test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
print('hello')
time.sleep(2)
print('hello, again')
我该如何解决?谢谢!
很抱歉没有解释为什么“捕获标准输出,然后再次将其写入标准输出”。在这里我真正想做的是将脚本输出捕获到记录器,记录器将它们输出到屏幕(StreamHandler)和日志文件(FileHandler)。我构建并测试了记录器部分,现在是“执行”部分。并且忽略stdout= 参数似乎不起作用。
管道:
- 设置记录器;
- 将 STDOUT、STDERR 重定向到记录器;
- 执行脚本;
由于第2步,如果我忽略stdout=参数,脚本的输出仍然会输出到STDOUT,并且不会登录文件。
也许我可以将stdout= 设置为记录器?
【问题讨论】:
-
为什么抓到
stdout,然后又写到stdout?您可以忽略该参数。 -
@Sraw 抱歉没有解释,我真正想做的是将脚本输出捕获到记录器,记录器将它们输出到屏幕(StreamHandler)和日志文件(FileHandler)。我构建并测试了记录器,现在是“执行”部分。并且忽略
stdout=参数将不起作用。
标签: python subprocess