Ich bin dabei, einige import hooks durch sys.meta_path
, in einem etwas ähnlichen Ansatz zu this SO question. Dazu muss ich zwei Funktionen definieren find_module
und load_module
wie im obigen Link erläutert. Hier ist meine load_module
Funktion,Import-Hooks für PyQt4.QtCore
import imp
def load_module(name, path):
fp, pathname, description = imp.find_module(name, path)
try:
module = imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
return module
die für die meisten Module funktioniert gut, aber nicht für PyQt4.QtCore
bei der Verwendung von Python 2.7:
name = "QtCore"
path = ['/usr/lib64/python2.7/site-packages/PyQt4']
mod = load_module(name, path)
, die zurückkommt,
Traceback (most recent call last):
File "test.py", line 19, in <module>
mod = load_module(name, path)
File "test.py", line 13, in load_module
module = imp.load_module(name, fp, pathname, description)
SystemError: dynamic module not initialized properly
Der gleiche Code funktioniert gut mit Python 3.4 (obwohl imp
wird veraltet und importlib
sollte idealerweise stattdessen dort verwendet werden).
Ich nehme an, das hat etwas mit der Initialisierung des dynamischen SIP-Moduls zu tun. Gibt es noch etwas, was ich mit Python 2.7 versuchen sollte?
Hinweis: Dies gilt sowohl für PyQt4
als auch für PyQt5
.
bearbeiten: dies kann zu this question wie in der Tat in Beziehung gesetzt werden,
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
mit dem gleichen Fehler fehlschlägt. Noch bin ich nicht sicher, was für einen Weg, um es wäre ...
EDIT2: Nach @Nikita ‚s Anfrage zu einem Anwendungsfall beispielsweise Beton, was ich zu tun versuchen, um den Import umleiten Wenn also import A
passiert, ist import B
. Man könnte tatsächlich denken, dass es dafür ausreichen würde, das Modul in find_spec/find_module
umzubenennen und dann den Standard load_module
zu verwenden. Es ist jedoch unklar, wo eine Standard-load_module
Implementierung in Python 2 zu finden ist. Die nächste Implementierung, die ich von etwas Ähnlichem gefunden habe, ist future.standard_library.RenameImport
. Es sieht nicht so aus, als gäbe es einen Backport der vollständigen Implementierung von importlib
von Python 3 auf 2.
Ein minimales Arbeitsbeispiel für die Import-Hooks, die dieses Problem reproduzieren, finden Sie in diesem gist.
Wenn es sinnvoll sein kann, für einigen allgemeinen Kontext zu geben, was ich versuche zu tun, finden Sie in das [SiQt] (https://github.com/rth/SiQt) Paket, und dieses Problem ist diskutiert in [dieser GitHub-Ausgabe] (https://github.com/rth/SiQt/issues/4). – rth
Ich verstehe Ihr Problem wirklich nicht, aber was ist falsch mit '__import __ ('PyQt4.QtCore')'. führt es zu unendlicher Rekursion? – danidee
@danidee Mit "__import __ ('A')" ist nichts falsch, aber es ist äquivalent zur Verwendung von 'import A'. Was ich will, ist zu ändern, was passiert, wenn Sie das tun, und insbesondere "Import B" ausführen, wenn Sie "A" importieren. Dies kann mit Import-Hooks in 'sys.meta_path' geschehen, aber sie erfordern Funktionen auf niedrigerer Ebene wie' imp.load_module'. – rth