我正在开发 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 中做什么?