如何让两个Python程序互相交互?
我有一个HTTP服务器在一个程序里,基本应用在另一个程序里。它们都是循环运行的,所以我不知道该怎么做:
- 写一个脚本,先启动应用程序,然后再启动HTTP服务器;
- 让这两个程序在运行时能互相交换数据。
这些事情通常是怎么做的呢?我很希望能看到用Python的解决方案,因为我的脚本是用Python写的。
用户是否会发出一个HTTP请求,向应用程序查询一些数据并返回结果? 是的
应用程序是否会收集数据并存储到某个地方? 应用程序和HTTP服务器都使用SQLite数据库。不过数据库可能是不同的。
6 个回答
其实,你可以直接使用 subprocess 这个模块。对于数据交换,你可以用 Popen.stdin 和 Popen.stdout 这两个流来实现。当然,你可以用很多其他的方法来做到这一点,比如 CORBA、DBUS、共享内存、DCOP,还有很多其他的选择。不过,建议你先试试最简单的方法,也就是用普通的 Python 管道/流。
在回答之前,我觉得我们需要更多的信息:
- 这里有没有一个明确的信息流程?
- 用户是否发起一个http请求,向应用程序查询一些数据并返回结果?
- 这个应用程序是否收集数据并把它存储到某个地方?
根据你实际使用的方式,有几种选择。可以使用套接字,或者通过文件或数据库传递信息。
[编辑] 根据你的回复,我觉得你可以用几种方法来实现:
- 如果你可以从网络服务器访问应用程序的数据库,你可以很容易地从那里获取你需要的信息。不过,这取决于你想交换什么信息。
- 如果你的应用程序只需要给http服务器一些结果,你可以把这些结果写入http服务器的数据库中的一个结果表。
- 可以使用管道或子进程,像其他人建议的那样,直接与后台应用程序交换数据。
- 使用一个日志文件,你的应用程序可以写入,而http服务器可以读取。
还有一些问题:
- 你需要双向通信吗,还是http服务器只是显示结果?
- 你使用的是什么网络服务器?
- 你可以使用什么处理语言?
根据这两个部分的依赖程度,最好是写一个新的应用程序,检查你的应用程序的数据库是否有变化(可以使用钩子、轮询等方式),并将相关信息发布到http服务器自己的数据库中。这种方式的好处是让这两个部分的耦合度降低,通常这是件好事。
我有一个网络服务器(Apache 2),它通过fastcgi模块与Django应用程序进行通信。可以看看djangobook中关于fastcgi的部分。Apache使用套接字(或常规tcp)与后台应用程序(Django)进行通信。
[编辑 2] 哎呀 - 刚发现你的网络服务器本身就是一个python进程。如果都是python的话,你可以在各自的线程中启动它们,并给它们传递队列对象,这样两个进程就可以以阻塞或非阻塞的方式相互发送信息。