boost::python - C++ 调用 Python 调用 C++

Posted

技术标签:

【中文标题】boost::python - C++ 调用 Python 调用 C++【英文标题】:boost::python - C++ calling Python calling C++ 【发布时间】:2018-02-22 15:24:17 【问题描述】:

我有一个可以通过 Python 代码扩展的应用程序,但扩展代码也将使用应用程序中的代码。我正在努力实现的示例:

//wrapped_module.cpp

void api_call()

 std::cout << "API call" << std::endl;


BOOST_PYTHON_MODULE(API)

  boost::python::def("api_call", api_call);

// extension.py

import API

def myExtension()
 # ... some python work ... #
 API.api_call()

// application_main.cpp

int main()

 // initialize interpreter
 // load "extension.py"
 // make "API" module available for "extension.py", so "import API" works
 // load "myExtension" from "extension.py"
 // myExtension()
 // <see "API call" in console output>

 return 0;

"extension.py" 永远不会作为独立脚本调用,它总是由 c++ 应用程序加载 - 因此我不需要单独构建 API.dll 模块以供 python 导入 - 或者我可以吗?

【问题讨论】:

github.com/TNG/boost-python-examples/blob/master/10-Embedding/… 【参考方案1】:

这是可能的,但并不完全简单。

您需要使用未记录的生成函数名称,在您的情况下为initAPI(它由单词init 和您的模块名称组成,区分大小写)。在调用Py_Initialize 之前,您需要将此函数作为参数传递给PyImport_AppendInittab

更新在 Python 3 中,使用 PyInit_API 代替 initAPI

下面是一个完整的工作程序,它嵌入 Python 并使用您的模块对其进行扩展,然后运行一个使用您的模块的简单程序。

#include <boost/python.hpp>
#include <iostream>

void api_call()

     std::cout << "API call" << std::endl;


BOOST_PYTHON_MODULE(API)

      boost::python::def("api_call", api_call);


int main (int argc, char* argv[])

    // Import your module to embedded Python
    PyImport_AppendInittab("API", &initAPI);

    // Initialise Python
    Py_Initialize();

    // Run Python code
    PyRun_SimpleString("import API\n"
                       "API.api_call()\n");


【讨论】:

我看到了几个使用 PyImport_AppendInittab("something", &initSomething) 的例子。我正在努力寻找那个神秘的 initSomething() 实际上在哪里......你击中了它。谢谢 我正在尝试运行此代码,但收到一条错误消息: In function 'int main()': full_flow.cpp:17:34: error: 'initAPI' was not declared in this scope PyImport_AppendInittab("API",initAPI);知道为什么会发生这种情况吗? @BidishaDas 在 Python 3 中称为 PyInit_API。

以上是关于boost::python - C++ 调用 Python 调用 C++的主要内容,如果未能解决你的问题,请参考以下文章

Python 线程内存布局(结合 boost::python)

boost::python - C++ 调用 Python 调用 C++

Boost python,嵌入时从python调用c++函数

在 boost python 中暴露 C++ 接口

使用boost python编译在python代码内部调用的c ++代码时出错

使用 C++ 指针调用 python 函数