gpt4 book ai didi

python - 仅在对象实例的生命周期内保持 Python 解释器事件

转载 作者:行者123 更新时间:2023-12-01 14:43:30 25 4
gpt4 key购买 nike

我定义了一个使用 python 解释器的类,如下所示:

class pythonInt
{
public:
pythonInt(const char* fname) {
py::initialize_interpreter();
m_Module = py::module::import(fname);
}
~pythonInt() {
py::finalize_interpreter();
}
py::module m_Module;
// ... other class members and functions that uses m_Module
};

int main()
{
pythonInt *p1 = new pythonInt("pybind_test1");
delete(p1);

pythonInt *p2 = new pythonInt("pybind_test1");
delete(p2);

return 0;
}

一旦类实例被破坏,当它到达删除实例 _Py_Dealloc(op) 时,我会收到 Access violation reading location 错误。我怎样才能完成解释器,以便我可以成功删除以前创建的类实例 p1 并安全地创建一个新的类实例 p2

最佳答案

崩溃是 b/c 数据成员 py::module m_Module;pythonInt 的构造函数/析构函数之前创建并在其之后销毁运行,因此在解释器初始化之前和完成之后。

pybind11 提供 scoped_interpreter为了您正在寻找的目的,C++ 保证访问 block 中所有数据成员的构造/销毁顺序。因此,假设您将所有 (Python) 数据放在一起并且 pythonInt没有基类(有 Python 数据成员),这是一个选项:

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

namespace py = pybind11;
class pythonInt
{
public:
pythonInt(const char* fname) {
m_Module = py::module::import(fname);
}
~pythonInt() {
}
py::scoped_interpreter m_guard;
py::module m_Module;
// ... other class members and functions that uses m_Module
};

int main()
{
pythonInt *p1 = new pythonInt("pybind_test1");
delete(p1);

pythonInt *p2 = new pythonInt("pybind_test2");
delete(p2);

return 0;
}

与您的示例相比,它增加了 #include <pybind11/embed.h>py::scoped_interpreter m_guard; (再次强调顺序是至关重要的);并且它删除了解释器初始化/完成。

关于python - 仅在对象实例的生命周期内保持 Python 解释器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60100922/

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