【问题标题】:making python programs "chat" via pipe通过管道使python程序“聊天”
【发布时间】:2011-03-17 03:41:39
【问题描述】:

我正在尝试使两个进程使用管道进行通信。 我在父进程中这样做了:

process = subprocess.Popen(test, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

process.stdin.write("4\n");
output = process.stdout.read()
print output

在子进程中:

inp = raw_input()
integer = int(inp)
print integer**2
while(True):
    pass

我希望父进程打印 16... 不幸的是,它仍然挂起,没有打印任何内容。将无限循环替换为休眠 5 秒会使父进程空闲 5 秒,然后打印 16。 这说明父进程只有在终止执行后才从子进程获取输出。

我想知道是否可以在程序完成之前获得输入。 我的想法是通过这个管道传递信息,获取输入,处理它,并在管道中输出结果,以便另一个可以继续处理。

有什么帮助吗? 谢谢,

曼努埃尔

【问题讨论】:

  • "4\n"的时候有没有试过刷流?
  • 是的,这不是问题。子进程实际上得到了 4,我已经看到了,因为在读取该输入之后,我将其写入常规文件,然后进入无限循环。父进程是在 read() 部分中阻塞的那个。
  • 出于好奇,为什么不在子进程中使用sys.stdin.readline()
  • 不知道,我总是用它来读取标准输入的输入...我不知道有什么区别,对吗?
  • @Manuel: raw_input 更面向交互式使用,Python3 中也缺少它。结果应该是一样的。

标签: python pipe stdout stdin multiprocessing


【解决方案1】:

按照ndim 的建议,在父级中执行以下操作:

process.stdin.write("4\n")    
process.stdin.flush()    
output = process.stdout.readline()    
print output

您还需要更换孩子:

inp = sys.stdin.readline()
integer = int(inp)
sys.stdout.write("%d\n", (integer ** 2,))
sys.stdout.flush()

我使用 sys.stdin.readlinesys.stdout.write 作为风格问题。

我写了2 test programs,他们在 Fedora 13 上使用 python-2.6.4-27 运行良好。

【讨论】:

  • 这并不能解决问题,但感谢您的帮助和风格建议!
  • 我已经解决了它,但是以一种非常丑陋的方式。您的解决方案简单且非常干净!非常感谢。 (你会得到解决方案标记,因为我会将我的代码更新为此......)
  • @Manuel:不客气!是时候确定这个问题了。
  • 这太棒了,找到一个这样的工作示例比您想象的要困难得多!实际上,我无法让有问题的示例正常工作,但 2 个测试程序的链接运行良好。
【解决方案2】:
【解决方案3】:

您必须为此使用选择。就像在子进程的通信方法中一样。 python issue tracker 对此进行了讨论。

【讨论】:

    【解决方案4】:

    我看到了一些可能的问题:

    a) 子进程从未真正刷新其输出,因此从未真正将其输出发送给父进程。

    b) 父进程在子进程实际发送其输出(刷新其输出)之前运行其read() 调用。

    c) 父进程执行阻塞 read() 直到 EOF,这实际上意味着它等待子进程退出。 subprocess.Popen 文档应该提到这是否可能。

    d) 父进程的 read() 调用在返回之前等待一定数量的字节(例如 1024)到达。

    可能让父级调用大量read(1) 并在它们传入时重新组装字节将解决问题。或者使用更高级别的通信 API,例如使用数据报而不是解析字节流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2020-09-07
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多