Я пытаюсь установить некоторые import hooks через sys.meta_path
, в несколько схожих подходах к this SO question. Для этого мне нужно определить две функции find_module
и load_module
, как описано в ссылке выше. Вот моя load_module
функции,Импортные крючки для 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
, который отлично работает для большинства модулей, но не выполняется для 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
.
Редактировать: это может быть связано с this question как, впрочем,
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
терпит неудачу с такой же ошибкой. Тем не менее я не уверен, что будет путь вокруг него ...
Edit2: после запроса @Nikita «s для случая, например конкретное использование, что я пытаюсь сделать, это перенаправить импорт , поэтому, когда import A
, что происходит, import B
. Можно было бы подумать, что для этого было бы достаточно переименовать модуль в find_spec/find_module
, а затем использовать значение по умолчанию load_module
. Тем не менее, неясно, где найти реализацию по умолчанию load_module
в Python 2. Ближайшая реализация, которую я нашел, похожа на future.standard_library.RenameImport
. Не похоже на то, что существует полная резервная копия полной версии importlib
от Python 3 до 2.
В этом gist содержится минимальный рабочий пример для импортных крючков, которые воспроизводят эту проблему.
Если это может быть полезно, чтобы дать некоторые общий контекст для того, что я пытаюсь сделать, см пакета [SiQt] (https://github.com/rth/SiQt), и эта проблема обсуждался в [этой проблеме github] (https://github.com/rth/SiQt/issues/4). – rth
Я действительно не понимаю вашу проблему, но что не так с '__import __ ('PyQt4.QtCore')'. приводит ли она к бесконечной рекурсии? – danidee
@ danidee Ничто не работает с '__import __ ('A')', но это эквивалентно использованию 'import A'. Я хочу изменить то, что происходит, когда вы это делаете, и, в частности, запустить 'import B', когда вы импортируете A'. Это можно сделать с помощью захватов импорта в 'sys.meta_path', но для них требуются более низкие функции уровня, такие как' imp.load_module'. – rth