如何在 boost::python 扩展模块中正确组合 C++ 和 Python 代码?
Posted
技术标签:
【中文标题】如何在 boost::python 扩展模块中正确组合 C++ 和 Python 代码?【英文标题】:How to properly combine C++ and Python code in boost::python extension module? 【发布时间】:2014-05-09 00:21:41 【问题描述】:我正在尝试创建结合了 C++ 和 Python 代码的 Python 扩展模块。到目前为止,我能够很好地运行 Python 代码,但我找不到让我的 Python 对象作为模块导入的一部分出现的方法。我究竟做错了什么?
这里是我的 C++ 模块的示例代码(为了清楚起见,我省略了绑定 C++ 函数和类的 C++/boost::python 代码):
#include <boost/python.hpp>
BOOST_PYTHON_MODULE( my_module )
<... some boost::python code to bind C++ classes/functions ...>
boost::python::object main_module = boost::python::import("__main__");
boost::python::object main_namespace = main_module.attr("__dict__”);
boost::python::exec("aaa = 'ABC’\n”, main_namespace, main_namespace);
如果我尝试,稍后在 Python 中:
import my_module
print my_module.aaa <— error!
(我知道我可以将 python 文件和 C++ 动态库分离到自己的文件中,这一切都可以工作,但出于其他技术原因,我确实需要我的扩展模块只是一个文件)
【问题讨论】:
【参考方案1】:boost::python::scope().attr("aaa")="ABC";
【讨论】:
是的,我知道这种解决方法,但我真的想在我的模块中执行任意 Python 代码(由第三方开发)。到目前为止,我什至尝试创建虚拟子模块,在其中执行 python 并将所有对象复制回来 - 它的 几乎 有效(“导入某物”和“从某物导入某物”不会以这种方式复制) @WorkPerNap:但是您正在修改主模块的命名空间,而不是 my_module 的命名空间。以上是关于如何在 boost::python 扩展模块中正确组合 C++ 和 Python 代码?的主要内容,如果未能解决你的问题,请参考以下文章
使用boost.python,如何扩展类的__dir__函数?
在 Windows 下使用 SCons 构建 boost::python 模块
boost::python - 如何从 C++ 在自己的线程中调用 python 函数?