如何让两个Python程序互相交互?

2 投票
6 回答
6733 浏览
提问于 2025-04-15 11:17

我有一个HTTP服务器在一个程序里,基本应用在另一个程序里。它们都是循环运行的,所以我不知道该怎么做:

  1. 写一个脚本,先启动应用程序,然后再启动HTTP服务器;
  2. 让这两个程序在运行时能互相交换数据。

这些事情通常是怎么做的呢?我很希望能看到用Python的解决方案,因为我的脚本是用Python写的。

  1. 用户是否会发出一个HTTP请求,向应用程序查询一些数据并返回结果? 是的

  2. 应用程序是否会收集数据并存储到某个地方? 应用程序和HTTP服务器都使用SQLite数据库。不过数据库可能是不同的。

6 个回答

3

其实,你可以直接使用 subprocess 这个模块。对于数据交换,你可以用 Popen.stdin 和 Popen.stdout 这两个流来实现。当然,你可以用很多其他的方法来做到这一点,比如 CORBADBUS共享内存DCOP,还有很多其他的选择。不过,建议你先试试最简单的方法,也就是用普通的 Python 管道/流。

3

a) 你可以通过 os.system 来启动应用程序:


os.system("command")

或者你也可以使用 subprocess 模块。更多信息可以在 这里 找到。

b) 使用套接字

2

在回答之前,我觉得我们需要更多的信息:

  1. 这里有没有一个明确的信息流程?
    1. 用户是否发起一个http请求,向应用程序查询一些数据并返回结果?
    2. 这个应用程序是否收集数据并把它存储到某个地方?

根据你实际使用的方式,有几种选择。可以使用套接字,或者通过文件或数据库传递信息。

[编辑] 根据你的回复,我觉得你可以用几种方法来实现:

  1. 如果你可以从网络服务器访问应用程序的数据库,你可以很容易地从那里获取你需要的信息。不过,这取决于你想交换什么信息。
  2. 如果你的应用程序只需要给http服务器一些结果,你可以把这些结果写入http服务器的数据库中的一个结果表。
  3. 可以使用管道或子进程,像其他人建议的那样,直接与后台应用程序交换数据。
  4. 使用一个日志文件,你的应用程序可以写入,而http服务器可以读取。

还有一些问题:

  1. 你需要双向通信吗,还是http服务器只是显示结果?
  2. 你使用的是什么网络服务器?
  3. 你可以使用什么处理语言?

根据这两个部分的依赖程度,最好是写一个新的应用程序,检查你的应用程序的数据库是否有变化(可以使用钩子、轮询等方式),并将相关信息发布到http服务器自己的数据库中。这种方式的好处是让这两个部分的耦合度降低,通常这是件好事。

我有一个网络服务器(Apache 2),它通过fastcgi模块与Django应用程序进行通信。可以看看djangobook中关于fastcgi的部分。Apache使用套接字(或常规tcp)与后台应用程序(Django)进行通信。

[编辑 2] 哎呀 - 刚发现你的网络服务器本身就是一个python进程。如果都是python的话,你可以在各自的线程中启动它们,并给它们传递队列对象,这样两个进程就可以以阻塞或非阻塞的方式相互发送信息。

撰写回答