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

Python 如何防止动态库的多次初始化,python,c,openssl,initialization,python-import,Python,C,Openssl,Initialization,Python Import,我正在开发Python 2.7版。 我有一个用C编写的Python模块扩展。 模块初始化函数PyMODINIT\u FUNC initmymodule包含一些初始化OpenSSL库的代码。我的模块构建为共享库,并通过imp.load\u dynamic 这个模块可能会加载很多次,我无法控制它。Django和python正在这样做。当它加载两次时,OPENSSL\u config函数也会调用两次。它会导致进程崩溃 我无法从C代码控制它,也无法从Python代码控制它 看看这些文件 它说: imp.

我正在开发Python 2.7版。 我有一个用C编写的Python模块扩展。 模块初始化函数
PyMODINIT\u FUNC initmymodule
包含一些初始化OpenSSL库的代码。我的模块构建为共享库,并通过
imp.load\u dynamic

这个模块可能会加载很多次,我无法控制它。Django和python正在这样做。当它加载两次时,
OPENSSL\u config
函数也会调用两次。它会导致进程崩溃

我无法从C代码控制它,也无法从Python代码控制它

看看这些文件 它说:

imp.load\u动态加载并初始化作为 动态加载共享库并返回其模块对象如果 模块已初始化,将再次初始化

很好

我发现类似的问题在Python版本3.4中得到了解决

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


但是在Python2.7中我应该怎么做呢?

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

  • Python导入挂钩
  • 新的导入挂钩-python 2.3+
  • 创建和注册自定义导入/重新加载函数-项目中的实现示例

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

我已经找到了问题的原因。这是因为我的django应用程序使用驱动程序连接PostgreSQL,并且该驱动程序加载OpenSSL库。它会导致冲突,正如本文所示


我想我必须将我的应用程序的所有加密功能都放到一个单独的进程中。

在源代码中到处挖掘,真是太好了+1向您投诉OpenSSL开发人员。这是他们库中的一个严重错误。asterik包通过使用他们自己的调用包装初始化调用实现了这一点。