如何在 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
重新加载模块后 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