gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:44:44 25 4
gpt4 key购买 nike

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

想明白为什么python对象的地址(从python的角度)和C++对象的地址不一样

python 实例和该实例的 c++ View 有何不同的内存地址?

这是一些工作代码,使用 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

最佳答案

如果我们快速看一下 py::object 在其声明中由什么组成 here ,您可以看到该类拥有一个 PyObject * 作为 protected 成员(继承自 py::handle)。该指针包含您看到的从 python 端打印出来的地址。如果你可以访问它,你会看到

cout << o.mptr << endl;

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

关于python - C++ 嵌入式解释器和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57583165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com