【问题标题】:Communicating multiple times with a subprocess [duplicate]与子进程多次通信[重复]
【发布时间】:2011-03-28 01:41:07
【问题描述】:

我正在尝试将输入通过管道传输到在 Python 中作为子进程打开的程序。使用communicate() 做我想做的事,但它只做一次,然后等待子进程终止,然后再让事情继续。

有没有功能上类似于communicate()的方法或模块,但允许与子进程进行多次通信?

这是一个例子:

import subprocess

p = subprocess.Popen('java minecraft_server.jar',
                 shell=True,
                 stdin=subprocess.PIPE);

//Pipe message to subprocess console here

//Do other things

//Pipe another message to subprocess console here

如果这可以在不使用子流程的情况下以更简单的方式完成,那也很棒。

【问题讨论】:

  • 问题是,虽然 subprocess.communicate() 在我第一次调用它时完全符合我的要求,但它会一直等到相关子进程终止。我需要在子进程的生命周期中进行多次通信,而communicate() 不允许这样做。

标签: communication subprocess python


【解决方案1】:

您可以根据需要将writep.stdin(以及每次flush 以确保实际发送数据)多次分开。只有当你想确保返回结果时才会出现问题(因为很难说服其他进程缓冲它们的输出!-),但因为你甚至没有设置 @987654324 @ 在您的 Popen 课程中,这对您来说显然不是问题。 (当它一个问题,并且您确实需要击败其他进程的输出缓冲策略时,pexpect -- 或 Windows 上的 wexpect -- 是最好的解决方案 -- 我非常推荐它们,经常在stackoverflow上,但现在手头没有URL,所以请自己搜索它们如果,与您的示例相反,您确实有这种需要)。

【讨论】:

  • 非常感谢您的回答。不过,我有一个问题。我目前有两个不同的地方可以写入 p.stdin 并刷新它,但它似乎要等到这两个中的第二个才发送,而不是在各自的时间分别发送它们。此外,第二条消息附加在末尾。也许我在这里误解了flush()的使用。
  • @Sean,第二个“消息”确实应该在第一个之后出现,如果这就是“附加在末尾”的意思。但问题是管道(例如标准输入)上没有“消息”的概念——它是一个不是一个消息队列。大多数“文本模式交互”程序一次从其标准输入中读取(并执行)一行 - 这是您的目标子进程遵循的策略,如果是,您是否正确发送行终止字符您的每条“信息”都结束了吗?或者,该流程还使用了哪些其他策略?
  • 不终止线路是完全我做错了什么。非常感谢您的帮助。
猜你喜欢
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多