当前位置: 首页 > 面试题库 >

如何使用子流程模块与流程正确交互

宋烨烁
2023-03-14
问题内容

我在使用子进程模块重定向另一个程序的stdio时遇到问题。仅仅从stdout中读取会导致挂起,并且Popen.communicate()可以工作,但是在读取/写入后会关闭管道。实现此目的最简单的方法是什么?

我在Windows上玩这个游戏:

import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
                        shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)
while True:
    proc.stdin.write('world\n')
    proc_read = proc.stdout.readline()
    if proc_read:
        print proc_read

问题答案:

并非100%适合您的示例,但有助于理解潜在的问题:进程P启动子项C。子项C向其标准输出中写入内容。C的stdout是一个具有4096个字符缓冲区的管道,其输出比该输出短。现在,C等待一些输入。对于C,一切都很好。

P等待输出永远不会出现,因为OS认为没有理由刷新C的输出缓冲区(其中的数据很少)。由于P永远不会获得C的输出,因此它将永远不会向C写入任何内容,因此C会挂起以等待P的输入。

修复:每写一个管道迫使OS发送数据后刷新使用 现在

在您的情况下,proc.stdin.flush()sys.stdout.flush()打印后在主while循环和子循环中添加应该可以解决您的问题。

您还应该考虑将从另一个进程读取的代码移动到线程中。这里的想法是,您永远无法知道数据何时到达,使用线程可以帮助您在编写处理结果的代码时理解这些问题。

在这个地方,我想向您展示新的Python 2.6文档,但是它也没有解释刷新问题:(哦,好吧…



 类似资料:
  • 问题内容: 我正在Python 2.6的GUI前端上工作,通常它非常简单:您使用或发出命令,然后等待命令完成或对错误做出反应。如果您有一个程序停止并等待用户交互,该怎么办?例如,程序可能会停止并要求用户提供ID和密码或如何处理错误? 到目前为止,我所阅读的所有内容都告诉您如何仅 在 程序完成 后 读取程序的所有输出,而不是如何在程序仍在运行时处理输出。我无法安装新模块(这是针对LiveCD的),并

  • 问题内容: 任何人都可以澄清一下下面的过程是否是正确的处理流程流的方法,而没有任何流缓冲区已满和阻塞问题 我正在从Java程序中调用外部程序,正在使用ProcessBuilder来构建流程,执行之后 我正在使用一种方法来处理流程 在我的方法中,我试图处理流程流 readStream方法用于读取我的流文本。 问题答案: 不,那不是正确的方法。 首先,在某些系统上,您的代码将永远停留在调用中,因为该过

  • 问题内容: 我的python脚本(python 3.4.3)通过子进程调用bash脚本: 该 bashscript 包含以下行: 这将打开与某个远程主机的共享主连接,以允许进行一些后续操作。 执行python脚本时,它将提示输入该行的密码,但是在输入密码后它将阻塞,并且永远不会返回。当我按ctrl- C终止脚本时,我看到连接已正确建立(因此行已成功执行)。 使用代替时,我没有此阻塞问题,但不检索标

  • 问题内容: 在python中,是否有一种方法可以调用一个新进程,在同一个上下文中处理它,例如标准IO流,关闭当前进程,并控制所调用的进程?这将有效地“替代”该过程。 我有一个要重复其行为的程序。但是,它使用了一个第三方库,而且看来,我真正能够杀死该库调用的线程的唯一方法是退出()我的python进程。 另外,它似乎可以帮助管理内存。 问题答案: 您可能对以下朋友感兴趣: 这些功能都执行一个新程序,

  • 问题内容: 我有使用Python编写的自定义命令行,该命令行使用“ print”语句打印其输出。我通过生成一个子进程并使用 child.stdin.write 方法向其发送命令来从Node.js使用它。来源: 现在的问题是我没有以流动模式接收输出。我希望在打印子进程后立即获得它的输出,但是仅当子进程终止时(使用自定义cli的 quit 命令),我才接收所有命令的输出。 问题答案: 您需要在子进程中

  • 安装 MacOS Homebrew brew update ##我的机器上无需这一步,Homebrew在install之前会自动update brew install yarn Windows 1、下载.smi按装包。确保Node.js已经安装并可用。>下载Yarn安装包 2、通过Chocolatey安装Chocolatey是Windows平台下的包管理器。安装好后打开命令行,执行下面的命令

  • 接口交互流程图: 完整交互流程图: 登录状态: 游客(未登录)状态:

  • 上周在一条流中出现了非常奇怪的NPE,这给我带来了很多麻烦,所以现在我觉得在使用流时使用NPE太安全了。 下面是我现在的方法: 我的问题是,我在这里处理的是外部POJO,所以我无法更改它并使其为空安全,所以我必须调整我的代码。 这里有一些限制:1)errorList-此处不能为null,因此调用是安全的-当它为空时,它只会返回false 2)和都可以为null,这就是为什么我使用这样的过滤器来确保