8

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

4

2 回答 2

3

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

这是一个骇人听闻的解决方案,所以如果要在生产系统中使用,我建议格外小心。

于 2013-05-20T22:43:32.680 回答
0

我找到了我的问题的原因。发生这种情况是因为我的 django 应用程序使用驱动程序连接 PostgreSQL,并且该驱动程序加载了 OpenSSL 库。正如user315052在此评论中显示的那样,它会导致冲突

我认为我必须将我的应用程序的所有加密功能取出到一个单独的进程中。

于 2013-05-21T20:01:51.647 回答