将Python HTTP服务器作为RPC服务器嵌入到C程序中?

时间:2012-10-23 03:04:57

标签: c++ python c http embedded

我有一个用C ++编写的程序,带有一个用于RPC的Web接口。我可以调用http://localhost/ListVariableshttp://localhost/RunFunction?var=1并让C代码执行ListVariables或RunFunction。它有效,但是当有那么多优秀的Python Web服务器时,我宁愿不用C / C ++管理Web服务器。

我想象的是让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程序?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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放在你的主循环中(或者如果你的话,在它自己的主题中) d)),然后离开你。对我来说,这似乎比嵌入python和处理两者之间传递数据和数据结构要容易得多。