如何在 module.reload() 之后保持 py::objects 存活
How to keep py::objects alive after module.reload()
重新加载模块后my_module
其所有对象都将被删除,但我想从C++中删除对象。如何防止Python删除对象?
#include <iostream>
#include <pybind11/embed.h>
class Obj{ ~Obj(){std::cout << "deleted" << std::endl;} };
PYBIND11_EMBEDDED_MODULE(module_obj, m) {
py::class_<Obj>(m,"Obj");
}
/*
#my_module.py
import module_obj
o = module_obj.Obj()
*/
py::scoped_interpreter intpr;
auto my_module = py::module::import("my_module")
auto* o = my_module.attr("o").cast<Obj*>()
my_module.reload() // now o is deleted, how to prevent it?
您需要将对象的引用计数保持在零以上o
。最简单的方法是在C++端进行py::object
(或者,等效地在python端创建一个对象(
#include <iostream>
#include <pybind11/embed.h>
namespace py=pybind11;
class Obj {
public:
~Obj() {
std::cout << "deleted" << std::endl;
}
};
PYBIND11_EMBEDDED_MODULE(my_module, m) {
py::class_<Obj>(m, "Cat")
.def(py::init());
}
int main() {
py::scoped_interpreter intpr;
std::cout << "Loading... " << std::endl;
auto my_module = py::module::import("my_module");
std::cout << "Load complete. " << std::endl;
py::object o = my_module.attr("Cat")(); // create new cat, automatically increases/decreases ref count
std::cout << "Reloading... " << std::endl;
my_module.reload(); // now o is deleted, how to prevent it?
std::cout << "Reload complete. " << std::endl;
}
输出:
Loading...
Load complete.
Reloading...
Reload complete.
deleted
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在类定义之后定义一个私有方法
- 在循环C++中指定字符串之后,不会打印该字符串
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- strncpy之后的char数组的错误行为
- 计算十进制 c++ 之后的数字
- "x += x--"之后的 x 是什么?
- 类的前向声明之后的类成员函数定义,在类声明之前
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- execlp() 在 fork() 之后无法正常工作
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 如何在MISRA C++之后实施CRTP
- 在 OpenCV 的 namedWindow 之前或之后初始化 Tesseract
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- 如何构建一个 setup.py 来编译C++使用 Python、pybind11 和 Mingw-w64 的扩展?
- 如何在 module.reload() 之后保持 py::objects 存活