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中做些什么呢?
也许可以通过注册自己的自定义导入挂钩来解决问题,您可以在其中控制导致问题的情况(防止双重初始化)。编写自定义导入钩子的一些参考:
这是一种黑客解决方案,因此如果要在生产系统中使用它,我建议格外小心。