Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在用户提示下流化子流程输出?_Python_Subprocess - Fatal编程技术网

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之外写入的输出和缓冲问题。