2012-10-23 116 views
2

为了RPC的目的,我有一个用C++编写的带有Web界面的程序。我可以拨打http://localhost/ListVariableshttp://localhost/RunFunction?var=1并让C代码执行ListVariables或RunFunction。它可以工作,但是我不想在C/C++中管理Web服务器,因为那里有很多好的Python Web服务器。将Python HTTP服务器作为RPC服务器嵌入到C程序中?

我想像的是将C程序调用到Python中,以启动另一个线程(即Tornado)上的Web服务器,返回到C然后继续进行计算。然后,当Python服务器在http://localhost/ListVariables上收到请求时,它会将调回到C中,并在已经运行的进程上执行ListVariables。

C -----> processing -----------> processing ------------> RPC: FuncA --------> 
|              ^  | 
    \---> Python Web Server ---------- Request for: FuncA --/ ... \--------> 
            ^
    browser: http://localhost/FuncA ---/ 

该项目有一个不幸的告诫,该程序必须从C开始。在做了一些研究之后,这似乎是一个边界案例,因为Python - > C和C - > Python可以用Cython完成。但是,我无法在C - > Python - > C上找到很多资源,因为我发现的大多数示例都描述链接到库而不是已经运行的进程。是否有可能让Python回调到正在运行的C程序中?

回答

1

绝对。 Create a "fake" module注入到sys.modules的C程序中,Python代码可以像导入任何其他模块一样导入和访问。

+0

谢谢。现在我只需要弄清楚如何用Cython来做到这一点,因为从我读过的内容中可以看出,它抽象了很多PythonC API。 –

0

我个人非常喜欢将嵌入式python的boost :: python库转换为C++,并处理两者之间的数据绑定和回调。 http://www.boost.org/doc/libs/1_51_0/libs/python/doc/

这就是说,你的建议听起来有点像PITA。我个人已经使用http://libevent.org/取得了很大的成功,以满足我的嵌入式Web服务器需求。它处理所有http服务器的东西,你需要做的就是给它一个你想要处理的URL和一个回调函数,把event_base_loop放在你的主循环的某个地方(或者如果你愿意,可以在它自己的线程中),并离开你去。对我来说,这似乎比嵌入python和处理在两者之间传递数据和数据结构要容易得多。

+0

因为我已经在使用boost,所以这可能是有道理的,所以我会研究它。我目前使用的是Mongoose(网络服务器,而不是数据库),所以改用libevent不会给我多少钱;我期待Python的简单性。 –