私はPythonバージョン2.7に取り組んでいます。C で記述された Python 用のモジュール拡張があります。モジュール初期化関数PyMODINIT_FUNC initmymodule
には、OpenSSL ライブラリを初期化するためのコードが含まれています。私のモジュールは共有ライブラリとして構築され、経由でロードされますimp.load_dynamic
このモジュールは何度もロードされる可能性があり、制御できません。Django と python がそれを行っています。そして、2回ロードすると、OPENSSL_config
関数呼び出しも2回になります。そして、それはプロセスのクラッシュにつながります。
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 フィールドを非負の数に設定します (モジュール固有の状態のサイズを示します)。共有ライブラリを 2 回ロードすることを避けるために、それらは引き続き拡張ディクショナリに記録されます。
しかし、Python 2.7 ではどうすればよいのでしょうか?