如何在 module.reload() 之后保持 py::objects 存活

一些开发人员

重新加载模块后,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对象的引用计数保持在零以上。最简单的方法是py::object在 C++ 端创建(或者,等效地在 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使Glide保持连接存活?

来自分类Dev

如何保持android进程存活

来自分类Dev

如何保持控制器存活

来自分类Dev

如何保持石英.net的调度程序存活?

来自分类Dev

主进程退出后如何保持线程存活?

来自分类Dev

(保持孤儿存活)如何在父删除时映射子实体以将parentID属性设置为null

来自分类Dev

如何在不使用 new 的情况下保持在其他对象中创建的对象存活?

来自分类Dev

如何保存活动状态?

来自分类Dev

如何保存活动状态?

来自分类Dev

如何保存活动数据?

来自分类Dev

在 Vue.js 中保持组件存活

来自分类Dev

如何在window.location.reload()之后打开模式

来自分类Dev

如何在图像中保存活动文本?

来自分类Dev

如何在JVM被杀死之前使线程永远存活?

来自分类Dev

如何在Android中保存活动状态

来自分类Dev

如何在保持流星尝试Reload._onMigrate每次更改的同时阻止Meteor Hot Reloads?

来自分类Dev

如何在保持流星尝试Reload._onMigrate每次更改的同时防止流星热重新加载?

来自分类Dev

当父进程退出时,如何让子进程存活?

来自分类Dev

删除关联后如何保存活动记录对象?

来自分类Dev

如何在`tight_layout()`之后保持恒定的间距?

来自分类Dev

如何在更改模式(陆地/港口)时保存活动状态?

来自分类Dev

Node.js 微服务如何在 Rabbitmq 重启后存活下来?

来自分类Dev

Is it possible to reload a python module as something?

来自分类Dev

Py_Initialize之后如何在C-Python API中添加内置模块?

来自分类Dev

如何在Django中的'python manage.py runserver'之后继续输入终端?

来自分类Dev

如何在py_function之后重塑(图像,标签)数据集

来自分类Dev

Web2py - 如何在 ajax 之后确定负载控制的结束

来自分类Dev

使用“ while true”来保持脚本存活是个好主意吗?

来自分类Dev

如何在使用“objects.values()”之前/之后将模型加入父模型?

Related 相关文章

  1. 1

    如何使Glide保持连接存活?

  2. 2

    如何保持android进程存活

  3. 3

    如何保持控制器存活

  4. 4

    如何保持石英.net的调度程序存活?

  5. 5

    主进程退出后如何保持线程存活?

  6. 6

    (保持孤儿存活)如何在父删除时映射子实体以将parentID属性设置为null

  7. 7

    如何在不使用 new 的情况下保持在其他对象中创建的对象存活?

  8. 8

    如何保存活动状态?

  9. 9

    如何保存活动状态?

  10. 10

    如何保存活动数据?

  11. 11

    在 Vue.js 中保持组件存活

  12. 12

    如何在window.location.reload()之后打开模式

  13. 13

    如何在图像中保存活动文本?

  14. 14

    如何在JVM被杀死之前使线程永远存活?

  15. 15

    如何在Android中保存活动状态

  16. 16

    如何在保持流星尝试Reload._onMigrate每次更改的同时阻止Meteor Hot Reloads?

  17. 17

    如何在保持流星尝试Reload._onMigrate每次更改的同时防止流星热重新加载?

  18. 18

    当父进程退出时,如何让子进程存活?

  19. 19

    删除关联后如何保存活动记录对象?

  20. 20

    如何在`tight_layout()`之后保持恒定的间距?

  21. 21

    如何在更改模式(陆地/港口)时保存活动状态?

  22. 22

    Node.js 微服务如何在 Rabbitmq 重启后存活下来?

  23. 23

    Is it possible to reload a python module as something?

  24. 24

    Py_Initialize之后如何在C-Python API中添加内置模块?

  25. 25

    如何在Django中的'python manage.py runserver'之后继续输入终端?

  26. 26

    如何在py_function之后重塑(图像,标签)数据集

  27. 27

    Web2py - 如何在 ajax 之后确定负载控制的结束

  28. 28

    使用“ while true”来保持脚本存活是个好主意吗?

  29. 29

    如何在使用“objects.values()”之前/之后将模型加入父模型?

热门标签

归档