python-c ++嵌入式解释器和对象

时间:2019-08-21 00:58:19

标签: python c++ pybind11 python-embedding

我有一个简单的C ++程序,该程序可以启动嵌入式python解释器,导入模块并实例化该模块中定义的类。

我想了解为什么python对象的地址(从python的角度来看)和C ++对象的地址不同。

python实例和该实例的c ++视图如何不同的内存地址?

下面是一些使用pybind11的工作代码:

#include <iostream>
#include <pybind11/pybind11.h>
#include <pybind11/embed.h>

using namespace std;
namespace py = pybind11;

int main()
{
    {
        py::scoped_interpreter guard{};
        py::module m = py::module::import("code");
        py::object o = m.attr("SomeClass")();
        cout << "[C++   ] object lives in " << &o << endl;
    }
    return 0;
}
def message_from_python(*args):
    print('[PYTHON]', *args)


class SomeClass:
    def __init__(self):
        message_from_python(self, 'being created')

    def __del__(self):
        message_from_python(self, 'being deleted')

编译,执行和标准输出:

$ g++ -O3 -Wall -std=c++14 `python3 -m pybind11 --includes` code.cc -o code -lpython3.6m
$ ./code
[PYTHON] <code.SomeClass object at 0x7fb6926f1da0> being created
[C++   ] object lives in 0x7fffbed02588                   
[PYTHON] <code.SomeClass object at 0x7fb6926f1da0> being deleted

1 个答案:

答案 0 :(得分:1)

如果我们快速查看声明herepy::object的含义,您会发现该类拥有PyObject *作为受保护成员(从{继承{1}})。该指针包含您看到的从python端打印出来的地址。如果可以访问它,将会看到

py::handle

产生与python shell指示的地址相同的地址。

相关问题