【发布时间】:2011-04-24 17:48:16
【问题描述】:
我有两个 python 应用程序。我需要在它们之间(两个进程之间)发送命令和数据。 最好的方法是什么?
一个程序是一个守护进程,它应该接受来自另一个 GUI 应用程序的命令和参数。
如何让守护进程监控来自 GUI 的命令,同时让它发挥作用? 我更喜欢跨平台的解决方案。
附言我使用 pyqt4 和 python。
【问题讨论】:
-
哦,有用的链接。谢谢。搜索时没有绊倒它。
我有两个 python 应用程序。我需要在它们之间(两个进程之间)发送命令和数据。 最好的方法是什么?
一个程序是一个守护进程,它应该接受来自另一个 GUI 应用程序的命令和参数。
如何让守护进程监控来自 GUI 的命令,同时让它发挥作用? 我更喜欢跨平台的解决方案。
附言我使用 pyqt4 和 python。
【问题讨论】:
您可以使用以下方法进行数据交换:
Socket 编程:在 Qt 中,您可以访问 QtNetwork 模块。示例见 qt 助手
IPC:使用在 QSharedMemory 类中实现的共享内存。
如果此应用程序仅在 unix 操作系统上运行,那么您可以尝试基于 Posix 的消息队列等进行数据交换
DBUS:您会发现 python 和 Qt 都具有基于 DBus 的支持。在 python 的情况下,您需要找到相关的模块。
使用多处理模块
使用基于 Posix/SystemV 的 IPC 机制,即管道、队列等。
【讨论】:
sys.stdin 在这种情况下是否有用,如果它是一个与 GUI 通信的守护进程,因为一个进程不太可能启动另一个进程。
示例。
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 重定向。
【讨论】:
虽然它与通信的方式 无关,但我建议查看pickle/cPickle 模块(它可以将对象编码为字符串流,反之亦然)。很有用。
【讨论】: