我正在寻找一种简单的方法来将C++类示例暴露给Python嵌入式解释器。
- 我有一个C++库。这个库是 Package 的(目前使用swig),我可以从python解释器使用它
- 我有一个C++主程序,它从我的库中示例化了一个Foo类,并嵌入了一个Python解释器
我想把我的Foo的C++世界示例公开给Python世界(并将其视为Foo类)。
这是可能的,如果是,如何?
我想这就像第一个答案:boost::python::ptr or PyInstance_New usage
我猜这意味着我应该使用boost.Python
来 Package 我的库?
我唯一的目标是在嵌入式python解释器中操作我的Foo的C++示例(不确定是否可以用前面的方法完成)。
事实上,我已经将我的Foo类暴露给了python(使用swig)。
我拥有的:
- 我的Foo类:*
class Foo{...};
- 我的封装库(包括Foo类)暴露给了python:*,这样我就可以启动python解释器并执行如下操作:
import my_module
foo=my_modulde.Foo()
我想要的:
有一个C主程序,它嵌入了一个python解释器并操作C世界变量。
int main(int argc, char **argv)
{
Foo foo; // instanciates foo
Py_Initialize();
Py_Main(argc, argv); // starts the python interpreter
// and manipulates THE foo instance in it
Py_Finalize();
return 0;
}
4条答案
按热度按时间c3frrgcw1#
Boost python允许您以非常紧密集成的方式将c类公开给python-您甚至可以 Package 它们,以便您可以从c类派生python类,并将虚拟方法解析为python重写。
boost python tutorial是一个很好的起点。
编辑:
你可以创建一个c++对象,并像这样将它的引用传递给内部的Python解释器:
cidc1ykv2#
作为参考,以下是如何使用pybind11实现这一点:
zu0ti5jz3#
我知道这是一个老问题,但这里有一个使用SWIG的解决方案。
foo.h:
foo.cpp:
foo.i:
生成通常的SWIG Package 器和运行时
生成包含
struct Foo
的SWIG模块:如果你想在多个模块之间共享类型信息,可以添加一个参数
-DSWIG_TYPE_TABLE=SomeName
。下面是
Foo
的C++示例如何传递给解释器上述内容可通过以下方式编译:
yvt65v4c4#
2023年答案
看起来pybind11现在让这变得非常容易,他们有一个特殊的头文件,用于使用pybind进行嵌入和一些详细的文档:
https://pybind11.readthedocs.io/en/stable/advanced/embedding.html
pybind11是一个只有头文件的库,所以这是跨平台的,不会增加额外的依赖性(除了python解释器)
下面是解决原始post问题的代码:
下面是一个基本的
CMakeLists.txt
,可以用来以跨平台的方式设置一个嵌入python的项目,pybind11
应该在external子文件夹中,你的源代码应该命名为test.cpp: