【问题标题】:How to make two python programs interact?如何让两个python程序交互?
【发布时间】:2010-10-22 07:38:31
【问题描述】:

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

  1. 编写一个脚本来启动应用程序,然后是 HTTP 服务器;
  2. 让这些程序在运行中交换数据。

这些事情通常是怎么做的?我真的很喜欢 Python 解决方案,因为我的脚本是用 Python 编写的。

  1. 用户是否发出 http 请求来查询应用程序以获取某些数据并返回结果?

  2. 应用程序是否收集数据并将其存储在某处? 应用程序和 HTTP 服务器都使用 SQLite 数据库。但是数据库可能不同。

【问题讨论】:

  • 这仍然很模糊。最好提供人与“系统”之间以及构成该“系统”的两个程序之间的实际交互。

标签: python multithreading ipc process interaction


【解决方案1】:

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


os.system("command")

或者你可以使用 subprocess 模块。更多信息here.

b) 使用套接字

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    1. 这里有可定义的信息管道吗?
      1. 用户是否发出 http 请求,向应用程序查询某些数据并返回结果?
      2. 应用程序是否收集数据并将其存储在某处?

    有几个选项取决于您实际使用它们的方式。套接字是一个选项或通过文件或数据库传递信息。

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

    1. 如果您可以从 Web 服务器访问应用程序的数据库,则可以轻松地从那里提取您所需要的信息。同样,这取决于您要交换什么信息。
    2. 如果您的应用只需要给 http 服务器一些结果,您可以将它们写入 http 服务器数据库中的结果表中。
    3. 按照其他人的建议,使用管道或子进程直接与后台应用交换数据。
    4. 使用您的应用可以写入的日志文件和您的 http 服务器读取的日志文件。

    还有一些问题:

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

    根据这两个部分的依赖程度,最好编写一个新应用程序来检查应用程序的数据库是否有更改(使用挂钩或轮询或其他方式)并将相关信息发布到 http 服务器自己的数据库中。这样做的好处是使两个部分的耦合不那么紧密,这通常是一件好事。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我看不出你的问题更新如何帮助解释你在做什么。据推测,您不想使用 db 进行消息传递。
      【解决方案5】:

      当我用 Python 编写 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,尽管它可以是任何东西)。

      【讨论】:

      • 是否可以在 CherryPy 的同一进程中实现一个阻塞调用的后台任务?事实上,我的后台任务是一个正在监听端口的服务器。我想整个事情可以看作是两个服务器相互交互。
      【解决方案6】:

      也许twisted 就是你要找的东西

      【讨论】:

        猜你喜欢
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        相关资源
        最近更新 更多