Python 如何在用户提示下流化子流程输出?
下面是我的子流程调用:Python 如何在用户提示下流化子流程输出?,python,subprocess,Python,Subprocess,下面是我的子流程调用: def myrun(cmd): p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout = [] while True: line = p.stdout.readline() stdout.append(line) print line, if line == '' and p.poll() != N
def myrun(cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout = []
while True:
line = p.stdout.readline()
stdout.append(line)
print line,
if line == '' and p.poll() != None:
break
return ''.join(stdout)
当我正常运行“cmd”时,输出通常如下所示:
一些文本…更多文本…
是否要继续[是/否]:y
更多输出 但如上图所示,在子流程中运行相同的“cmd”,我的输出如下: 是否要继续[是/否]:y
一些文本…
更多文本…
更多输出
我该如何解决这个问题?这基本上是因为无论您的
cmd
程序有什么,通常都会有缓冲区。您必须禁用在该程序中发生的默认缓冲,才能获得所需的内容
如果是通过cmd运行的python文件,如下图所示,可以使用python命令添加“-u”
参数以获得所需的结果
cmd = ["python", "-u", "/link/to/python/file.py"]
myrun(cmd)
根据python的man文档
-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x
对于任何要在shell中运行的文件,我认为stdbuf
命令是您的安全赌注。将-o
选项与命令一起设置为0(零),就可以开始了
cmd = ["sh", "\path\to\sh\file.sh"]
unbuffered_cmd = ["stdbuf", "-o0", "-e0"] + cmd
myrun(unbuffered_cmd)
请注意,这是GNU coreutils附带的。因此,它可能不是平台不可知论
为了更安全起见,即使存在stdbuf
并且为python设置了“-u”
,请将Popen的bufsize
参数设置为1
Popen(cmd, stdout=PIPE, stderr=STDOUT, bufsize=1)
如果stdbuf
stdbuf
也没有帮助的话,我没有选择了:-)谢谢!stdbuf似乎在排序中起到了作用!但是现在我遇到了一个问题,它在显示提示消息之前等待用户提示。@nerdinary:如果子进程将提示直接写入终端,那么尝试影响其标准输出缓冲区(使用-u
或标准输出缓冲区
)不会有帮助。请参见。在这种情况下,谁输入y
?看见阅读此处提供的链接:使用pty
应该修复在stdout/stderr之外写入的输出和缓冲问题。