我正在调用一个非常嘈杂的CLI命令,并且想要过滤输出(大概是stderr)。 CLI二进制文件的输出会像python日志记录,INFO:…或WARNING:…这样交换。在shell中运行时,CLI命令首先会包含一些“设置”日志,而在几秒钟后,每秒将启动几十个实际日志。
我已经尝试将stderr以及类似的stdout插入到这样的过程中:
process = subprocess.Popen(cmd,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
while process.stderr:
line = process.stderr.readline()
print("STDERR", line)
while process.stdout:
line = process.stdout.readline()
print("STDOUT", line)
这可行,并且STDERR打印出现在CLI命令执行的头几位。但是,几秒钟后到达零件时,我的STDERR打印输出仅为b''
-可能与普通shell调用输出其他日志的频率相同。我也尝试使用read()
而不是readline()
,但无济于事。 (顺便说一句,“ STDOUT”永远不会被调用)
以某种方式,在常规Shell调用中记录的输出是不同的,或者是太频繁(?)或不完整(?),以使PIPE无法通过它发送并正确读取和打印它。
我该怎么做才能进一步调试呢?
答案 0 :(得分:1)
一个选项是将以下while循环替换为:
for line in iter(process.stderr.readline, b''):
print("STDERR", line)
这至少可以解决以下事实:process.stderr
即使什么也没读,也永远不会变得虚假。