已经有很多答案解决了如何做这个一般的事情,但是我的主要问题是为什么这种方法不起作用?
我正在尝试从子进程“实时流式传输”stdout和stderr。 我可以通过执行以下操作来实现:
import sys
import subprocess
def run_command(cmd):
process = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
for out in iter(process.stdout.readline, b''):
print(out)
for err in iter(process.stderr.readline, b''):
print(err)
run_command(['echo', 'hello', 'world']) # should print hello world
run_command(['rm', 'blarg223']) # Should print to stderr (file doesnt exist)
这样做可以给我带来以下结果:
b'hello world\n'
b'rm: cannot remove \xe2\x80\x98blarg223\xe2\x80\x99: No such file or directory\n'
然而,这会导致一个问题,因为它只实时流式传输标准输出(stdout),然后在结束时打印所有错误信息。所以我认为可以使用以下方法来解决这个问题:
def run_command(cmd):
process = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
for out, err in zip(iter(process.stdout.readline, b''), iter(process.stderr.readline, b'')):
print(out)
print(b'Error: ' + err)
但是,这并没有产生任何输出。为什么使用zip不起作用?