如何使两个python程序交互?

时间:2009-04-28 12:58:45

标签: python multithreading ipc process interaction

我在一个程序中有一个HTTP服务器,在另一个程序中有我的基本应用程序。它们都是循环,所以我不知道如何:

  1. 编写一个脚本,启动应用程序,然后编写HTTP服务器;
  2. 让这些程序在运行中交换数据。
  3. 这些事情通常如何完成?我真的很喜欢Python解决方案,因为我的脚本是用Python编写的。

    1. 用户是否发出了一个http请求,该请求会在应用中查询某些数据并返回结果?的

    2. 该应用收集数据并存储在某个地方吗? 应用程序和HTTP Server都使用SQLite数据库。但是,数据库可能有所不同。

6 个答案:

答案 0 :(得分:3)

a)您可以使用 os.system 启动应用程序:


os.system("command")

或者您可以使用子流程模块。更多信息here

b)使用套接字

答案 1 :(得分:3)

好吧,你可以使用subprocess模块。对于交换数据,您可能只能使用Popen.stdin和Popen.stdout流。当然,您/可以/做的方式没有限制。 CORBADBUSshared memoryDCOP,列表继续。但首先尝试简单的方法,在这种情况下是常规的python管道/流。

答案 2 :(得分:2)

在回答之前,我认为我们需要更多信息:

  1. 这里有可定义的信息渠道吗?
    1. 用户是否发出了一个http请求,该请求会向应用查询某些数据并返回结果?
    2. 应用程序是否收集数据并将其存储在某个位置?
  2. 根据您实际使用它们的方式,有一些选项。套接字是一种选择,或通过文件或数据库传递信息。

    [编辑] 根据您的回复,我认为有几种方法可以做到:

    1. 如果您可以从网络服务器访问应用程序的数据库,您可以轻松地从那里获取您所需的信息。同样,它取决于您想要交换的信息。
    2. 如果您的应用只需要为http服务器提供一些结果,您可以将它们写入http服务器数据库的结果表中。
    3. 使用其他人建议的管道或子流程直接与后台应用交换数据。
    4. 使用您的应用可以写入的日志文件,并从中读取您的http服务器。
    5. 还有一些问题:

      1. 您是否需要双向通信,或者http服务器只显示结果?
      2. 您使用的是哪个网络服务器?
      3. 您可以使用哪些处理语言?
      4. 根据两个部分的依赖程度,最好编写一个新的应用程序来检查应用程序的数据库是否有变化(使用挂钩或轮询或其他)并将相关信息发布到http服务器自己的数据库中。这样做的好处是可以使两个部分不那么紧密耦合,这通常是一件好事。

        我有一个网络服务器(Apache 2),它使用fastcgi模块与Django应用程序对话。看看the section in djangobook on fastcgi。 Apache使用套接字(或常规tcp)与后台应用程序(Django)进行通信。

        [编辑2] 糟糕 - 只是发现您的网络服务器本身就是一个python进程。如果它都是python,那么你可以launch each in it's own thread并传递它们两个Queue对象,这两个对象允许两个进程以阻塞或非阻塞方式发送彼此信息。

答案 3 :(得分:1)

根据您的目的,您可以使用os.mkfifo创建命名管道,以在两个程序之间共享数据。

http://mail.python.org/pipermail/python-list/2006-August/568346.html

答案 4 :(得分:1)

也许twisted就是你要找的东西

答案 5 :(得分:0)

当我用Python编写Web应用程序时,我总是将我的Web服务器保持在与后台任务相同的过程中。我不知道您使用的是哪种Web服务器,但我个人使用CherryPy。您的应用程序可以将一堆线程作为Web服务器,但是您可以将许多其他线程作为后台任务。这样您就不需要任何带有套接字,命名管道等的复杂IPC。相反,您只需访问共享的,全局的,同步的数据结构来传递信息,而您的不同模块可以直接调用彼此的功能。

编辑:为了澄清,您可以使用threading module在与其他阻止服务器不同的线程中运行您的CherryPy服务器。例如:

def listener():
    sock = get_socket_from_somewhere()
    while True:
        client, addr = sock.accept()
        # send data back to client, etc

from threading import Thread
t1 = Thread(target=listener)
t1.setDaemon(True)
t1.start()

cherrypy.quickstart() # you'd need actual arguments here

此示例显示如何在与Web服务器相同的进程中的一个线程中使用阻塞服务器(在本例中为CherryPy,尽管它可以是任何东西)。