我在哪里定义代码以释放在C Python模块init函数中分配的资源?

时间:2016-04-14 07:25:38

标签: c++ c python-2.x python-c-api

Extending Python with C or C++涉及定义一个共享库,它沿着

行公开initialization function
PyMODINIT_FUNC
initspam(void)
{
    (void) Py_InitModule("spam", SpamMethods);
}

假设我在这里分配资源,比如通过

分配全局对象
g_bookkeeping = new Bookkeeping;

写出相应的delete声明的正确位置是什么?似乎没有任何钩子可以注意到模块已卸载,或者是否存在?

我简要地考虑过使用全局对象,比如

Bookkeeping g_bookkeeping;

...但我希望能够精确控制何时构造或破坏该对象。

Python文档talks about finalization并提到了Py_Finalize()调用 - 至少在Python 2.x - internally calls PyImport_Cleanup中。但是,就定制模块关闭而言,这似乎没什么用。

1 个答案:

答案 0 :(得分:1)

A message to an issue from 2010表示您正在使用的Python版本:

  

[...]

     

请接受Python确实不支持在2.x中为严重的,基本的,不可克服的技术问题卸载模块。

     

[...]

     

支持卸货将是(并且是)一个多年的项目。不要期望在未来五年内取得任何成果。

The documentation for Py_Finalize()也提及错误和警告:

  

不会卸载由Python加载的动态加载的扩展模块。