我正在尝试以与此 SO question有点相似的方法设置一些导入挂钩。为此,我需要定义两个函数,如上面链接中所述。这是我的功能,sys.meta_path
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
然后使用 default就足够了load_module
。但是,目前尚不清楚在 Python 2 中哪里可以找到默认load_module
实现。我发现的最接近的类似实现是future.standard_library.RenameImport
. 看起来没有importlib
从 Python 3 到 2 的完整实现的反向移植。
可以在此gist中找到重现此问题的导入挂钩的最小工作示例。