gpt4 book ai didi

python - 实时从子进程中读取标准输出

转载 作者:IT老高 更新时间:2023-10-28 21:12:42 26 4
gpt4 key购买 nike

鉴于此代码段:

from subprocess import Popen, PIPE, CalledProcessError


def execute(cmd):
with Popen(cmd, shell=True, stdout=PIPE, bufsize=1, universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')

if p.returncode != 0:
raise CalledProcessError(p.returncode, p.args)

base_cmd = [
"cmd", "/c", "d:\\virtual_envs\\py362_32\\Scripts\\activate",
"&&"
]
cmd1 = " ".join(base_cmd + ['python -c "import sys; print(sys.version)"'])
cmd2 = " ".join(base_cmd + ["python -m http.server"])

如果我运行 execute(cmd1) 输出将毫无问题地打印出来。

但是,如果我运行 execute(cmd2) 而不是什么都不会打印,为什么会这样以及如何修复它以便我可以实时查看 http.server 的输出。

另外,如何在内部评估 for line in p.stdout?在到达 stdout eof 之前是某种无限循环吗?

这个话题已经在 SO 中讨论过几次,但我还没有找到 Windows 解决方案。上面的代码片段是来自 answer 的代码我正在从 virtualenv 运行 http.server(win7 上的 python3.6.2-32bits)

最佳答案

如果你想从一个正在运行的子进程中连续读取,你必须让那个进程的输出没有缓冲。您的子进程是 Python 程序,这可以通过将 -u 传递给解释器来完成:

python -u -m http.server

这是它在 Windows 盒子上的样子。

enter image description here

关于python - 实时从子进程中读取标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46592284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com