2009-04-28 45 views
2

我在一个程序中有一个HTTP服务器,在另一个程序中有我的基本应用程序。他们都是循环,所以我不知道如何:如何让两个python程序进行交互?

  1. 编写一个脚本,将启动应用程序,然后HTTP服务器;
  2. 使这些程序在操作中交换数据。

这些事情通常如何完成?我会真正appriciate Python解决方案,因为我的脚本是用Python编写的。

  1. 用户是否提出了一个http请求来查询应用程序的某些数据并返回结果?

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

+0

这还是很模糊的。提供人与“系统”之间以及组成这个“系统”的两个程序之间的实际交互是很好的。 – 2009-04-28 14:26:35

回答

2

回答之前,我想我们需要一些更多的信息:

  1. 有这里的信息可定义管道?
    1. 用户是否提出了一个http请求来查询应用程序的某些数据并返回结果?
    2. 该应用收集数据并将其存储在某个地方吗?

有几个选项,这取决于你如何实际使用它们。套接字是一个选项或通过文件或数据库传递信息。

[编辑]根据您的回复我觉得有你能做到几个方面:

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

一些其他问题:

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

根据两个部分如何依赖就可以了,它可能是最好写一个新的应用程序来检查你的应用程序的数据库更改(使用挂钩或轮询或其他)和后期培训相关信息到HTTP服务器拥有数据库。这样做的好处是可以将两部分紧密结合起来,这往往是件好事。

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

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

3

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


os.system("command") 

,或者您可以使用模块。更多信息here

B)使用套接字

+0

谢谢,你的意思是TCP套接字或其他一些套接字? – Alex 2009-04-28 13:07:26

+0

还有其他种类的插座吗?我很好奇你为什么问,@亚历克斯。 – 2009-04-28 13:09:06

+0

不完全。IPC套接字是相似的,但不使用网络堆栈。详情请参阅http://www.cs.cf.ac.uk/Dave/C/node28.html和http://en.wikipedia.org/wiki/Unix_domain_sockets。 – 2009-04-28 13:10:22

3

那么,你可能只使用subprocess模块。对于交换数据,您可能只能使用Popen.stdin和Popen.stdout流。当然,你的/可以/做的方式没有限制。 CORBA,DBUS,shared memory,DCOP,名单继续。但首先尝试简单的方法,在这种情况下是普通的python管道/流。

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的,但它可以是任何东西)。

相关问题