我在ubuntu raring的python2.7中使用gobject-introspection,并且在构建一些包时遇到导入错误。我已经隔离了一组最小的步骤来复制它:
制作本地目录结构:
gi:
__init__.py
overrides:
__init__.py
放置标准样板
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
print __path__, __name__
在__init__.py
个文件中。
从包含gi
本地副本的目录中,运行以下命令:
python -c "from gi import repository"
我收到一条如下所示的错误消息:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/gi/repository/__init__.py", line 25, in <module>
from ..importer import DynamicImporter
File "/usr/lib/python2.7/dist-packages/gi/importer.py", line 28, in <module>
from .module import DynamicModule
File "/usr/lib/python2.7/dist-packages/gi/module.py", line 37, in <module>
from .overrides import registry
ImportError: cannot import name registry
任何解释?我找不到任何关于预期行为的体面文档,因为gobject-introspection看起来像是一个记录很差的项目。非常感谢帮助!
答案 0 :(得分:1)
来自Python文档:
让Python处理这些文件需要
__init__.py
个文件 包含包的目录;这是为了防止 无意中具有通用名称的目录,例如string 隐藏稍后在模块搜索路径上出现的有效模块。
只需从正在运行的目录中访问这些__init__.py
文件,就可以告诉解释器这是gi模块的一个实现。主gi模块的任何使用都将无法正确使用。
现在,为什么它会将错误打印为来自/usr/lib
?因为在gi
中找到了local/gi
,但在gi.repository
中找到了/usr/lib/python2.7/dist-packages/gi/repository
。它正在运行/usr/lib/python2.7/dist-packages/gi/repository/__init__.py
。从那里,它正确导入其他一些子模块,但当它尝试导入overrides
时,它会在gi/overrides
中找到您的本地存根。你的存根没有定义注册表,所以你有失败。
尝试将registry='dumb_string'
放入gi/overrides/__init__.py
并查看错误消失。