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++函数