Python 当它调用的进程尚未发出换行符时,是否有从subprocess.Popen实例读取字符的方法?

Python 当它调用的进程尚未发出换行符时,是否有从subprocess.Popen实例读取字符的方法?,python,newline,subprocess,popen,Python,Newline,Subprocess,Popen,我正在尝试编写一个在工作中经常使用的程序。当使用数量不足的参数或拼写错误的参数调用时,程序会向用户发出提示,询问所需的输入。因此,当使用subprocess.Popen调用例程时,当传递错误的参数时,例程从不向stdout或stderr发送任何信息。subprocess.Popen.communicate()和subprocess.Popen.read(1)在任何信息可用之前都会等待换行符 在发出换行符之前,是否有办法从subprocess.Popen.stdout检索信息?如果没有,是否有任何

我正在尝试编写一个在工作中经常使用的程序。当使用数量不足的参数或拼写错误的参数调用时,程序会向用户发出提示,询问所需的输入。因此,当使用subprocess.Popen调用例程时,当传递错误的参数时,例程从不向stdout或stderr发送任何信息。subprocess.Popen.communicate()和subprocess.Popen.read(1)在任何信息可用之前都会等待换行符


在发出换行符之前,是否有办法从subprocess.Popen.stdout检索信息?如果没有,是否有任何方法可用于确定子流程是否正在等待输入?

首先要尝试的是:将
bufsize
参数设置为,并将其设置为
0

subprocess.Popen(args, bufsize=0, ...)
不幸的是,这是否有效还取决于子流程如何刷新其输出,我认为您对此没有太多控制权

在某些平台上,刷新写入标准输出的数据时,实际上会根据底层I/O库是否检测到交互终端或管道而发生变化。因此,虽然您可能认为数据正在等待读取——因为这是它在终端窗口中的工作方式——但当您在Python中运行与另一个子进程相同的程序时,它实际上可能是行缓冲的


添加:我刚刚意识到
bufsize=0
是默认值。胡说八道。

打听了不少之后,有人向我指出了解决办法。使用pexpect.spawn和pexpect.expect。例如:

名为prompt.sh的文件中的Bash“script”来模拟问题-不能直接从pexpect.spawn调用read。 #!/bin/bash

read -p "This is a prompt: "
当subprocess.Popen调用时,此选项将挂起。它可以由pexpect.spawn处理,但是:

import pexpect
child = pexpect.spawn('./prompt.sh')
child.expect(search)
>>> 0
print child.after #Prints the matched text
>>> 'This is a prompt: '

列表、已编译正则表达式或已编译正则表达式列表也可以用来代替pexpect中的字符串。除了处理不同的提示之外。

实际上,subprocess.Popen的默认值是bufsize=0。不过,谢谢你的尝试@涡度-嘿,是的,我在发布后看到:/