【问题标题】:Embed Python HTTP server into C program as RPC server?将 Python HTTP 服务器作为 RPC 服务器嵌入到 C 程序中?
【发布时间】:2012-10-23 03:04:56
【问题描述】:

我有一个用 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 上的请求时,它会将 back 调用到 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 程序中?

【问题讨论】:

    标签: c++ python c http embedded


    【解决方案1】:

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

    【讨论】:

    • 谢谢。现在我只需要弄清楚如何使用 Cython 来做到这一点,因为从我读过的内容来看,它抽象了很多 PythonC API。
    【解决方案2】:

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

    话虽如此,您的提议听起来有点像 PITA。我个人在使用http://libevent.org/ 来满足我的嵌入式网络服务器需求方面取得了很大的成功。它为你处理所有的 http 服务器的东西,你需要做的就是给它你想要处理的 url 和一个回调,把 event_base_loop 放在你的主循环中的某个地方(或者如果你愿意的话,放在它自己的线程中),然后你就走了。对我来说,这似乎比嵌入 python 和处理两者之间传递的数据和数据结构要容易得多。

    【讨论】:

    • 由于我已经在使用 boost,这可能是有道理的,所以我会研究一下。我目前正在使用 Mongoose(Web 服务器,而不是 DB),所以切换到 libevent 不会给我带来太多好处;我正在寻找 python 的简单性。
    猜你喜欢
    • 2012-01-14
    • 2010-12-07
    • 2011-04-25
    • 2016-01-05
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多