考虑以下代码片段:
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
是如何在内部评估的?它是否是一种无限循环,直到达到stdouteof或其他东西?
这个主题已经在SO中多次讨论过,但我没有找到一个Windows解决方案。上面的片段来自于这个答案,我正在从virtualenv中运行http.server(python3.6.2-32位win7)。
cmd /c ...
内容。 - fpbhb" ".join
,因为在列表中执行单个元素时它不起作用。 - Chen A.