【问题标题】:How to interchange data between two python applications?如何在两个 python 应用程序之间交换数据?
【发布时间】:2011-04-24 17:48:16
【问题描述】:

我有两个 python 应用程序。我需要在它们之间(两个进程之间)发送命令和数据。 最好的方法是什么?

一个程序是一个守护进程,它应该接受来自另一个 GUI 应用程序的命令和参数。

如何让守护进程监控来自 GUI 的命令,同时让它发挥作用? 我更喜欢跨平台的解决方案。

附言我使用 pyqt4 和 python。

【问题讨论】:

标签: python process pyqt4 pid


【解决方案1】:

您可以使用以下方法进行数据交换:

  1. Socket 编程:在 Qt 中,您可以访问 QtNetwork 模块。示例见 qt 助手

  2. IPC:使用在 QSharedMemory 类中实现的共享内存。

  3. 如果此应用程序仅在 unix 操作系统上运行,那么您可以尝试基于 Posix 的消息队列等进行数据交换

  4. DBUS:您会发现 python 和 Qt 都具有基于 DBus 的支持。在 python 的情况下,您需要找到相关的模块。

  5. 使用多处理模块

  6. 使用基于 Posix/SystemV 的 IPC 机制,即管道、队列等。

【讨论】:

  • 是否可以仅使用 python 在应用程序之间进行交互?例如子进程模块和 Popen.communicate。你认为使用 Qt 库会更容易吗?
  • -1:没有提到普通管道和普通的sys.stdin和sys.stdout。
  • @S. Lott - 我不确定sys.stdin 在这种情况下是否有用,如果它是一个与 GUI 通信的守护进程,因为一个进程不太可能启动另一个进程。
  • @Dave Webb:也许吧。但是,我编写了 GUI,它分叉子进程并与子进程 stdin 和 stdout 进行通信。所以,我认为它是可行的。
  • @PocketSam 您应该能够使用多处理模块并且也可以这样做。我使用了多处理模块,它工作正常。
【解决方案2】:

示例。

Program_1.py

import pickle
import sys
for i in range(100):
    pickle.dump(i,sys.stdout)

Program_2.py

from __future__ import print_function
import pickle
import sys
while True:
    obj= pickle.load(sys.stdin)
    print( obj )

用法:

Program_1.py | Program_2.py 

在 Windows 下,这可能会表现出不良行为,因为 Windows 会破坏简单的文件 IO 重定向。

【讨论】:

    【解决方案3】:

    虽然它与通信的方式 无关,但我建议查看pickle/cPickle 模块(它可以将对象编码为字符串流,反之亦然)。很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多