2010-10-13 121 views
8

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

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

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

p.s.我使用pyqt4和python。

+1

类似于http://stackoverflow.com/questions/3902997/capturing-output-from-buffered-stdout-program/3905899#3905899 – 2010-10-13 09:09:40

+0

哦,有用的链接。谢谢。搜索时没有绊倒它。 – PocketSam 2010-10-13 10:51:29

回答

10

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

  1. Socket编程:在Qt您可以访问QtNetwork模块。请参阅qt助手示例

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

  3. 如果这个应用程序将运行在UNIX操作系统而已,那么你可以尝试基于POSIX消息队列等的数据交换

  4. DBUS:你会发现Python和Qt的已经基于的DBus支持。在python的情况下,你需要找到相关的模块。

  5. 使用多处理模块

  6. 使用POSIX的/ SystemV IPC机制又名管道,队列等

+0

仅使用python的应用程序之间进行交互是否可行?例如使用子流程模块和Popen.communicate。你认为使用Qt库会是easyer吗? – PocketSam 2010-10-13 10:46:29

+0

-1:无法提及普通管道和普通的sys.stdin和sys.stdout。 – 2010-10-13 11:09:09

+0

@S。洛特 - 我不确定'sys.stdin'在这种情况下是否有用,如果它是一个与GUI进行通信的守护进程,因为一旦这个进程不可能启动另一个进程。 – 2010-10-13 12:14:43

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重定向。

相关问题