Ich arbeite an Python Version 2.7.
Ich habe eine Modul-Erweiterung für Python in C geschrieben.
Die Modulinitialisierungsfunktion PyMODINIT_FUNC initmymodule
enthält einen Code zum Initialisieren der OpenSSL-Bibliothek. Mein Modul wurde als Shared Library erstellt und über imp.load_dynamic
Dieses Modul lädt möglicherweise viele Male und ich kann es nicht steuern. Django und Python machen das. Und wenn es zweimal lädt, ruft OPENSSL_config
function auch zweimal auf. Und es führt zum Prozessabsturz.
Ich kann es nicht aus C-Code steuern, ich kann es nicht aus Python-Code steuern.
Hier sehen Sie sich die Dokumentation an Ссылка Es sagt:
imp.load_dynamic Lädt und initialisiert ein als implementiertes Modul dynamisch ladbare shared library und gibt das Modulobjekt zurück. Wenn das Modul wurde bereits initialisiert, es wird wieder initialisiert .
Nett.
Ich habe festgestellt, dass das ähnliche Problem in Python Version 3.4 gelöst wurde Ссылка
Module, die mehrere Initialisierungen unterstützen, setzen ihre m_size Feld zu einer nicht negativen Zahl (Angabe der Größe der modulspezifischer Zustand). Sie werden immer noch in den Erweiterungen gespeichert Wörterbuch, um zu vermeiden, dass geteilte Bibliotheken zweimal geladen werden.
Aber was soll ich in Python 2.7 machen?
Vielleicht, um Abhilfe zu schaffen, indem Sie einen eigenen benutzerdefinierten Import-Hook registrieren, mit dem Sie den Fall steuern können, der Ihnen Probleme bereitet (doppelte Initialisierung). Einige Referenzen zum Schreiben von benutzerdefinierten Import-Hooks:
Dies ist hackish Lösung, daher schlage ich besondere Vorsicht vor, wenn dies in Produktionssystemen verwendet werden soll.
Ich habe die Ursache meines Problems gefunden. Es passiert, weil meine Django-Anwendung einen Treiber verwendet, um PostgreSQL zu verbinden, und dieser Treiber lädt die OpenSSL-Bibliothek. Es führt zu einem Konflikt, wie user315052 in diesem Kommentar
Ich denke, ich muss alle Krypto-Funktionen meiner Anwendung in einen separaten Prozess übernehmen.
Tags und Links python c python-import initialization openssl