如何使用pybind11重新加载使用C ++源代码构建的python模块

问题描述

我正在使用pybind11文档中的第一步示例

#include <pybind11/pybind11.h>
int add(int i,int j)
{
    return i + j;
}
PYBIND11_MODULE(example,m)
{
    m.doc() = "pybind11 example plugin"; // optional module docstring
    m.def("add",&add,"A function which adds two numbers");
}

一切正常,我可以在python shell中使用它:

import  example
example.add(2,3) #returns 5

现在我做了一个简单的更改,使用float而不是int作为add()的输入,一切都编译了。我想重新加载模块示例,以便我可以测试基于新float的add()。但是,我不知道重新加载示例模块的方法importlib.reload不起作用,%autorelaod 2中的IPython也不起作用。 两者都经过测试可与基于python的纯模块一起使用,但不适用于基于c ++和pybind11的模块。

在这里错过了什么吗?还是应该像这样?

更新:似乎这是与How to Reload a Python3 C extension module?

相关的已知问题

Python的导入机制将永远不会dlclose()共享库。一旦 加载后,该库将一直保留,直到进程终止。

pybind11模块和ctypes模块似乎在这里关于如何加载/导入模块具有相同的特征。 还要引用https://github.com/pybind/pybind11/issues/2511

Python扩展C扩展的方式不允许 重新加载(与python模块签定合同,在该模块中Python代码可以 只是重新加载而没有引用动态加载的库)

我现在只是想知道是否有一种方法可以以更方便的方式将其包装起来以重新加载模块。例如,为新的python shell生成一个子进程,该子进程复制所有与C扩展相关的变量/模块,并替换原来的变量/模块。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)