我正在尝试设置一些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的要求,我所要做的是重新进口,所以当一个人做import A
,会发生什么import B
。我们的确可以认为,对于此模块,只需在find_spec/find_module
中进行模块重命名即可,然后使用默认的load_module
即可。然而,目前还不清楚在Python 2中如何找到默认的load_module
实现。我发现的类似的最接近的实现是future.standard_library.RenameImport
。它看起来并不像是从Python 3到2的完整实现importlib
的一个backport。
在这个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'。我想要的是当你这样做的时候改变发生的事情,特别是当你导入A时运行'import B'。这可以通过'sys.meta_path'中的导入钩子完成,但是它们需要较低级别的函数,例如'imp.load_module'。 – rth