gpt4 book ai didi

python - 未调用 PyBind11 析构函数?

转载 作者:行者123 更新时间:2023-12-05 07:24:24 61 4
gpt4 key购买 nike

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

作为变通方法,必须显式删除 Python 对象,但我不明白为什么!

请有人解释一下这里出了什么问题,以及如何在 Python 对象被垃圾回收时自动调用 destructor

Pybind11绑定(bind)代码:

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 垃圾收集器:当对象的引用计数器变为零时,垃圾收集器可能销毁该对象(从而调用 c++ 析构函数)但它不必在那一刻执行

这个想法在此处的答案中得到了更全面的阐述:

https://stackoverflow.com/a/38238013/790979

同样在上面的链接中提到,如果您需要在 Python 中的对象生命周期结束时进行清理,一个不错的解决方案是 context management ,您将在对象的包装器中定义 __enter____exit__ (在 pybind11 或 Python 本身中),让 __exit__ 释放网络资源,然后在 Python 客户端代码中,类似于:


with listener(print_string, 'tcp://127.0.0.1:9001', clientCertPath, serverCertPath, proxyCertPath, desiredSources, 'time_series_data', enableCurve, enableVerbose) as lstnr:
# Run for a minute
cnt = 0
while cnt < 60:
cnt += 1
time.sleep(1)

关于python - 未调用 PyBind11 析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55452762/

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