如何防止动态库的多次初始化

che*_*ise 8 c python openssl initialization python-import

我正在使用Python 2.7版.我有一个用C编写的Python模块扩展.模块初始化函数PyMODINIT_FUNC initmymodule包含一些初始化OpenSSL库的代码.我的模块构建为共享库并通过加载imp.load_dynamic

这个模块可能加载很多次,我无法控制它.Django和python这样做.当它加载两次然后OPENSSL_config函数调用两次.它导致流程崩溃.

我无法用C代码控制它,我无法用Python代码控制它.

在这里查看文档 http://docs.python.org/2.7/library/imp.html 它说:

imp.load_dynamic加载并初始化一个实现为可动态加载的共享库的模块,并返回其模块对象.如果模块已经初始化,它将再次初始化.

尼斯.

我发现在Python 3.4版中解决了类似的问题 http://hg.python.org/cpython/file/ad51ed93377c/Python/import.c#l459

支持多次初始化的模块将其m_size字段设置为非负数(表示模块特定状态的大小).它们仍然记录在扩展字典中,以避免两次加载共享库.

但是我应该在Python 2.7中做些什么呢?

Rob*_*ujo 3

也许可以通过注册自己的自定义导入挂钩来解决问题,您可以在其中控制导致问题的情况(防止双重初始化)。编写自定义导入钩子的一些参考:

这是一种黑客解决方案,因此如果要在生产系统中使用它,我建议格外小心。