首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用c++源代码重新加载使用pybind11构建的python模块

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

Stack Overflow用户
提问于 2020-09-19 18:52:07
回答 1查看 678关注 0票数 5

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

代码语言:javascript
复制
#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中使用它:

代码语言:javascript
复制
import  example
example.add(2, 3) #returns 5

现在,我做了一个简单的更改,使用float代替int作为add()的输入,所有东西都会编译。我希望重新加载模块示例,这样我就可以测试新的基于浮动的add()。但是,我无法找到重新加载示例模块的方法。importlib.reload不工作,%autorelaod 2IPython中也不工作。这两种方法都经过测试,以使用纯基于python的模块,而不是基于c++和pybind11的模块。

我错过了什么吗?还是应该是这样?

更新:似乎这是一个与How to Reload a Python3 C extension module?相关的已知问题

的导入机制永远不会关闭共享库。加载后,库将一直保留到进程终止为止。

pybind11模块和ctype模块在如何加载/导入模块方面似乎具有相同的特性。还引用了https://github.com/pybind/pybind11/issues/2511的话

加载C扩展的方式不允许重新加载它们(在与Python模块的约定中,Python代码可以被重新加载,而不引用动态加载的库)

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

EN

回答 1

Stack Overflow用户

发布于 2022-10-03 15:36:49

这似乎不太简单。由于可以手动管理标准共享库dlopen() & dlclose(),所以可以将PYBIND11_MODULE更改为预定义的函数,如

代码语言:javascript
复制
void __bind_module(void *bind_) {
  typedef void (*binder_t)(const char *, py::cpp_function);
  auto bind = (binder_t) bind_;
  bind("add", add);
}

然后编写一个管理模块来附加/分离这些库。就像从你自己那里得到的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63972298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档