Я пытаюсь настроить некоторые крючки импорта через sys.meta_path
, в несколько схожих подходах к this SO вопрос. Для этого мне нужно определить две функции find_module
и load_module
, как описано в ссылке выше. Вот моя функция load_module
,
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
который отлично работает для большинства модулей, но не работает для PyQt4.QtCore
при использовании Python 2.7:
name = "QtCore"
path = ['/usr/lib64/python2.7/site-packages/PyQt4']
mod = load_module(name, path)
который возвращает,
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
Тот же код отлично работает с Python 3.4 (хотя imp
становится устаревшим и importlib
в идеале следует использовать вместо него).
Я полагаю, что это имеет какое-то отношение к инициализации динамического модуля SIP. Есть ли что-нибудь еще, что я должен попробовать с Python 2.7?
Примечание: это относится как к PyQt4
, так и к PyQt5
.
Изменить: это может быть связано с этим вопросом, как действительно,
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
не работает с той же ошибкой. Тем не менее я не уверен, что бы это было вокруг...
Edit2: после запроса @Nikitastrong > для конкретного примера использования, я пытаюсь перенаправить импорт, поэтому, когда вы делаете import A
, что происходит, это import B
. Можно было бы подумать, что для этого достаточно переименовать модуль в find_spec/find_module
, а затем использовать по умолчанию load_module
. Однако неясно, где найти реализацию по умолчанию load_module
в Python 2. Ближайшая реализация, которую я нашел, похожа на future.standard_library.RenameImport
. Не похоже, что имеется полный путь реализации importlib
от Python 3 до 2.
В этом gist можно найти минимальный рабочий пример для крючков импорта, воспроизводящих эту проблему.