Я пытаюсь настроить некоторые перехватчики импорта через sys.meta_path
, используя несколько похожий подход. на этот вопрос 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: следуя запросу @Nikita о конкретном примере использования, я пытаюсь перенаправить импорт, поэтому, когда кто-то делает import A
, происходит следующее: import B
. Можно было бы подумать, что для этого достаточно будет переименовать модуль в find_spec/find_module
, а затем использовать дефолтный load_module
. Однако неясно, где найти реализацию load_module
по умолчанию в Python 2. Ближайшая реализация чего-то подобного, которую я нашел, — это future.standard_library.RenameImport
. Не похоже, что есть бэкпорт полной реализации importlib
с Python 3 на 2.
Минимальный рабочий пример перехватчика импорта, который воспроизводит эту проблему, можно найти в этом суть.
__import__('PyQt4.QtCore')
. приводит ли это к бесконечной рекурсии? - person danidee   schedule 22.04.2016__import__('A')
нет ничего плохого, но это эквивалентно использованиюimport A
. Я хочу изменить то, что происходит, когда вы это делаете, и, в частности, запускаетеimport B
, когда выimport A
. Это можно сделать с помощью перехватчиков импорта вsys.meta_path
, но для них требуются функции более низкого уровня, такие какimp.load_module
. - person rth   schedule 24.04.2016imporylib
в Python 2.7 написано: Этот модуль является второстепенным подмножеством того, что доступно в более полнофункциональном одноименном пакете из Python 3.1, обеспечивающем полную реализацию импорта. . Есть мысли о пользовательском импорте в PEP302, я посмотрю на это и поделиться своими мыслями в обновлении ответа. - person Nikita   schedule 25.04.2016