如何在两个Python应用程序之间交换数据?

12

我有两个Python应用程序。我需要在这两个应用程序之间(即两个进程之间)发送命令和数据。

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

如何让守护进程在执行其工作的同时监视来自GUI的命令? 我更喜欢跨平台的解决方案。

p.s. 我使用pyqt4和python。


1
类似于http://stackoverflow.com/questions/3902997/capturing-output-from-buffered-stdout-program/3905899#3905899的输出捕获。 - Ankur Gupta
哦,有用的链接。谢谢。在搜索时没有碰到过它。 - PocketSam
3个回答

11
您可以使用以下方法进行数据交换:
  1. Socket编程:在Qt中,您可以访问QtNetwork模块。请参见qt助手以获取示例。

  2. IPC(进程间通信):使用QSharedMemory类实现的共享内存。

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

  4. DBus:您会发现python和Qt都支持基于DBus的通信。对于Python,您需要找到相关模块。

  5. 使用多进程模块

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


仅使用Python是否可以在应用程序之间进行交互?例如,使用subprocess模块和Popen.communicate。您认为使用Qt库会更容易吗? - PocketSam
1
-1:未提及普通管道和普通的sys.stdin和sys.stdout。 - S.Lott
@S. Lott - 如果这是一个守护进程与GUI通信的情况,我不确定sys.stdin是否有用,因为很少有一个进程会启动另一个进程。 - David Webb
@Dave Webb:也许吧。然而,我已经编写了GUI,可以分叉子进程并与子进程的标准输入和输出进行通信。因此,我认为这是可行的。 - S.Lott
1
@PocketSam,你可以使用multiprocessing模块来完成。我之前就用过multiprocessing模块,并且它能够正常工作。 - Ankur Gupta

2

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


0

例子。

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重定向方式,可能会出现不良行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接