gobject-introspection覆盖会导致导入错误

时间:2013-05-05 21:17:01

标签: python ubuntu python-2.7 gobject-introspection

我在ubuntu raring的python2.7中使用gobject-introspection,并且在构建一些包时遇到导入错误。我已经隔离了一组最小的步骤来复制它:

  1. 制作本地目录结构:

    gi:
            __init__.py
            overrides:
                    __init__.py
    
  2. 放置标准样板

    from pkgutil import extend_path
    
    __path__ = extend_path(__path__, __name__)
    print __path__, __name__
    

    __init__.py个文件中。

  3. 从包含gi本地副本的目录中,运行以下命令:

    python -c "from gi import repository"
    
  4. 我收到一条如下所示的错误消息:

    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
    
  5. 任何解释?我找不到任何关于预期行为的体面文档,因为gobject-introspection看起来像是一个记录很差的项目。非常感谢帮助!

1 个答案:

答案 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并查看错误消失。