Python子进程交互:监视(stdout)+通信(stdin)2.7.5

2024-10-01 02:26:17 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我正在尝试使用subprocesslibrary(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,这对单个进程或命令很有效。在

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

^{pr2}$

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

我尝试过刷新缓冲区,使用3种不同的方法读取/迭代stdout的输出,但是它们都只是阻塞或者只给出输出文本的一小部分。另一方面,如果我使用communicate方法,我会得到我期望的所有文本,但是它会终止进程。我也有过EOF错误和其他随机事件。在

我已经读过了:一些指南说这是2.6.x中的一个bug,但在2.7.x中仍然存在——显然stdout是缓冲的,不能更改。我已经尝试过很多不同的方法来解析来自不同线程的输出,但是我仍然不能在2.7.X上使用

肯定有人知道如何与子流程交互吗?我唯一的选择是使用pexcept吗?在

在我的环境中,我无法真正切换到python3.x.x。我希望这会是相当直接的:(

干杯

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


Tags: 方法命令selftrue管道进程错误stdout