PyBind11 析构函数未调用?

2023-12-21

我有一个c++类包裹着PyBind11。问题是:当Python脚本结束c++ destructor不会被自动调用。这会导致不整齐的退出,因为网络资源需要由析构函数释放。

作为解决方法,有必要显式删除Python反对,但我不明白为什么!

请有人解释一下这里出了什么问题以及如何获得destructorPython对象被垃圾收集了吗?

Pybind11绑定代码:

py::class_<pcs::Listener>(m, "listener")
    .def(py::init<const py::object &, const std::string &, const std::string &, const std::string &, const std::string &, const std::set<std::string> &, const std::string & , const bool & , const bool & >(), R"pbdoc(
    Monitors network traffic.

    When a desired data source is detected a client instance is connected to consume the data stream.

    Reconstructs data on receipt, like a jigsaw.  Makes requests to fill any gaps.  Verifies the data as sequential.

    Data is output by callback to Python.  Using the method specified in the constructor, which must accept a string argument.
)pbdoc");

在Python中:

#Function to callback
def print_string(str):
    print("Python; " + str)

lstnr = listener(print_string, 'tcp://127.0.0.1:9001', clientCertPath, serverCertPath, proxyCertPath, desiredSources, 'time_series_data', enableCurve, enableVerbose)

#Run for a minute
cnt = 0
while cnt < 60:
    cnt += 1
    time.sleep(1)

#Need to call the destructor explicity for some reason    
del lstnr

所以几年后我通过启用解决了这个问题Python 上下文管理器 https://docs.python.org/3/reference/datamodel.html#context-managers with通过添加支持__enter__ and __exit__方法处理我的PyBind11 https://pybind11.readthedocs.io/en/stable/index.html# code:

py::class_<pcs::Listener>(m, "listener")
.def(py::init<const py::object &, const std::string &, const std::string &, const std::string &, const std::string &, const std::set<std::string> &, const std::string & , const bool & , const bool & >(), R"pbdoc(
    Monitors network traffic.

    When a desired data source is detected a client instance is connected to consume the data stream.
    
    Specify 'type' as 'string' or 'market_data' to facilitate appropriate handling of BarData or string messages.

    Reconstructs data on receipt, like a jigsaw.  Makes requests to fill any gaps.  Verifies the data as sequential.

    Data is output by callback to Python.  Using the method specified in the constructor, which must accept a string argument.
)pbdoc")
.def("__enter__", &pcs::Listener::enter, R"pbdoc(
    Python 'with' context manager support.
)pbdoc")    
.def("__exit__", &pcs::Listener::exit, R"pbdoc(
    Python 'with' context manager support.
)pbdoc");

在C++类中添加相应的函数,如下所示:

//For Python 'with' context manager
auto enter(){std::cout << "Context Manager: Enter" << std::endl; return py::cast(this); }//returns a pointer to this object for 'with'....'as' python functionality
auto exit(py::handle type, py::handle value, py::handle traceback){ std::cout << "Context Manager: Exit: " << type << " " << value << " " << traceback <<  std::endl; }

N.B.

  1. 返回的指针值来自enter()as功能在一个with....as陈述。

  2. 参数传递给exit(py::handle type, py::handle value, py::handle traceback)是有用的调试信息。

Python 用法:

with listener(cb, endpoint, clientCertPath, serverCertPath, proxyCertPath, desiredSources, type, enableCurve, enableVerbose):
cnt = 0
while cnt < 10:
    cnt += 1
    time.sleep(1)

Python 上下文管理器现在调用 C++ 对象的析构函数,从而顺利地释放网络资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyBind11 析构函数未调用? 的相关文章

  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 如何列出 python PDB 中的当前行?

    在 perl 调试器中 如果重复列出离开当前行的代码段 可以通过输入命令返回到当前行 点 我无法使用 python PDB 模块找到任何类似的东西 如果我list如果我自己离开当前行并想再次查看它 似乎我必须记住当前正在执行的行号 对我来说
  • 将输入发送到 python 子进程而不等待结果

    我正在尝试为一段代码编写一些基本测试 该代码通常通过 stdin 无休止地接受输入 直到给出特定的退出命令 我想检查程序是否在给出一些输入字符串时崩溃 经过一段时间来考虑处理 但似乎无法弄清楚如何发送数据而不是陷入等待我不知道的输出关心 我
  • Matplotlib Scatter - ValueError:RGBA 序列的长度应为 3 或 4

    我正在尝试为我的功能绘制图表 但不断收到此错误 ValueError RGBA sequence should have length 3 or 4 每当我只有 6 种形状时 代码就可以完美运行 但现在我将其增加到 10 种 它就不起作用了
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 如何有效地从 loadmat 函数生成的嵌套 numpy 数组中提取值?

    python中是否有更有效的方法从嵌套的python列表中提取数据 例如A array array 12000000 dtype object 我一直在使用A 0 0 0 0 当你有很多像 A 这样的数据时 这似乎不是一个有效的方法 我也用
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • Django South - 将 null=True 字段转换为 null=False 字段

    我的问题是 转变的最佳做法是什么null True场变成null False使用 Django South 的字段 具体来说 我正在与ForeignKey 你应该先写一个数据迁移 http south aeracode org docs t
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 我可以使用正则表达式和 pandas 在两个数据帧之间执行左连接/合并吗?

    我正在尝试使用 Python 中的正则表达式执行左合并 该正则表达式可以处理多对多关系 例子 df1 pd DataFrame a b c d columns col1 df1 regex df1 col1 col1 regex 0 a a
  • LinqToSql 查询中的条件快捷方式

    这是一个 LinqToSql 的小陷阱 Returns the number of counties in a state or all counties in the USA if the state is null public sta
  • 向字符串类添加函数

    我知道从 std string 类继承是一个糟糕的主意 但只是尝试使用继承向 string 类添加自定义函数以进行虚拟分配 我想将我的函数称为 add 当我执行 str add str1 str2 时它应该在字符串的开头附加 str1 在字
  • 如何使用 Perl 从文件中获取恰好 n 个随机行?

    跟进this https stackoverflow com questions 448005 whats an easy way to read random line from a file in unix command line问题
  • 我的联系表单的提交按钮未提交和重定向

    我正在开发我的第二个网站 在创建这个网站和我的第一个网站的整个过程中 StackOverflow 上的人们给了我很大的帮助 我可以浏览并找到几乎所有我不想知道的东西 我遇到的 99 的问题 我都用我在这里读到的答案解决了 首先非常感谢大家
  • 计算 R 中一个组中两个值同时出现的次数

    我搜索了这个问题的答案并发现了类似的答案 计算每组内的行数 https stackoverflow com questions 9809166 count number of rows within each group 计算 R 数据帧列
  • 提取N位数字的前X位

    如何选择一个数字的前2位数字 我只需要函数的名称 示例 12455 变为 12 13655 变为 13 基本上它相当于整数的子字符串 如果最后您再次需要一个数字向量 元素 您可以使用 as numeric substr x 1 2
  • 当我在 Android 设备上手动安装 app-debug.apk 时,它崩溃了

    当我从 Android studio 运行项目时 我的应用程序在 Android 设备上运行良好 但是 当我在设备上手动安装 app debug apk 时 应用程序在启动时崩溃 并且 app debug unaligned apk 没有生
  • 如何向 text_field_tag 添加占位符?

    我的表格中有以下行 text field tag mother name nil id mother name autocomplete class form group form control autocomplete off data
  • 使用fstream写入

    我试图在指定文件中查找一行并将其替换为我的行 我无法访问将要运行该程序的计算机上的库 因此我创建了一个自定义文件 问题似乎是对 fstream 对象的写入调用 我想知道你们中是否有人可以提供帮助 另外 我的 getline 循环在到达文件末
  • Python Selenium 将数据存储到 CSV 中的特定列?

    我有两份印刷品想写到一张CSV文件存入列A和列B 我的问题是 当我在最后打印 第一次和第二次打印 时 我只得到一个元素 我猜是多次 因为它不在循环之内 print text link 0 9 Result LMFCIIC PWFERT BK
  • 资源泄漏和内存泄漏与性能之间的关系

    对于资源泄漏 我指的是 Streams StreamWriter 我想它们正在消耗文件描述符 Handles GDI 或用户图形字体 很快所有 Closable 对象都可以算作资源 如果应用程序存在一些资源泄漏 假设某些输入流没有关闭 它们
  • 如何在 Zend 框架的 ini 文件中编写路由链……的链?

    我正在尝试使用 Zend 框架的 INI 文件定义如下路由 http api example com servicename http api example com servicename 版本 users userid items it
  • 如何在没有后端的情况下保存用户输入

    我刚刚学习 JavaScript 和 Web 开发 我想知道我想做的事情是否可能 我想编写一个 JavaScript 测验来保存用户输入的答案 而不需要后端 这可能吗 如果不可能 我能做到这一点的最简单和最容易的方法是什么 谢谢 PS 如果
  • 如何将 X11 键符号映射到 Unicode 字符?

    X11 将键码映射到键符号 然后将键符号映射到 Unicode 在程序中检索键符号到 Unicode 映射的好方法是什么 Try this http www cl cam ac uk mgk25 ucs keysym2ucs c
  • 通用 git 重置为默认上游 HEAD

    是否有语法可以重置为当前分支的默认上游 HEAD 就像是 git checkout mybranch git reset hard origin mybranch where origin mybranch可以通用当前分支的上游 HEAD
  • Windows - 无法启动 Git:可能 Git 可执行文件的路径无效

    Can t start Git C Users Cloudion PC AppData Local GitHub PortableGit d93ee8917cfa9add886773e6be9ec08609a502b6 bin git ex
  • 是否有任何理由在 Maven 中为我自己的传递依赖项保留显式依赖项声明?

    我已经阅读了一段时间有关 Maven 中的显式依赖声明与传递 隐式 依赖声明的内容 大多数人倾向于同意您应该始终显式声明项目所依赖的库 主要是为了避免版本不匹配 这是完全合理的 但是我们应该如何解决我们的内部依赖性 如果可以通过传递机制解决
  • 在纯文本 div 中插入新行

    我正在使用一个 CMS 它只允许特定 div 中的文本 HTML 例如 br 被解析为 lt br gt 对于 Unicode HTML 代码 例如 amp 会产生 and x00040 会产生 但它似乎不允许换行 回车 我怎样才能把一个
  • PyBind11 析构函数未调用?

    我有一个c 类包裹着PyBind11 问题是 当Python脚本结束c destructor不会被自动调用 这会导致不整齐的退出 因为网络资源需要由析构函数释放 作为解决方法 有必要显式删除Python反对 但我不明白为什么 请有人解释一下