基本上我正在尝试使用子进程库(Popen)自动化一些Linux安装程序(和其他任务) .

在过去,我已经能够打开这样的流程:

self.process = subprocess.Popen( self.executable,
                                stdout=subprocess.PIPE, 
                                stderr=subprocess.STDOUT,
                                universal_newlines=True, shell=True)
    output, cmdError = self.process.communicate()

然后,我可以为错误消息打印输出或cmdError,这适用于单个进程或命令 .

但是当我需要与子进程交互并检查输出时,这是非常困难的,这是我执行此操作的代码:

def ExecProcessWithAnswers(self):
    self.process = subprocess.Popen( self.executable,
                                stdout=subprocess.PIPE, 
                                stderr=subprocess.STDOUT,
                                stdin=subprocess.PIPE,
                                universal_newlines=True, shell=True)
    while self.process.poll() is None:
        print self.process.stdout.readline()

基本上我的想法是,我将轮询输出(stdout管道),然后在从安装程序(stdin)请求某个输入时发送命令 .

我已经尝试刷新缓冲区,使用3种不同的方式来读取/迭代stdout的输出,但是所有这些只是阻塞或只给我输出文本的一小部分 . 另一方面,如果我使用沟通方法,我会得到我期望的所有文本,但它会终止该过程 . 我也有EOF错误和其他随机的东西 .

我读过:一些指南说这是2.6.x中的一个错误,但它仍然在2.7.x中 - 显然stdout是缓冲的,无法更改 . 我已经尝试了许多不同的方法来解析各种线程的输出,但我仍然无法在2.7.X上使用它 .

当然有人必须知道如何与子进程交互?我唯一的选择是使用pexcept吗?

我无法在我的环境中切换到Python 3.x.x.我希望这会相当直接:(

干杯

编辑:我也尝试删除不同的管道,写入文件,更改popen上的缓冲区大小,禁用shell和通用换行符等 .