gobject-introspection覆盖导致导入错误

问题描述:

我在ubuntu raring上使用python2.7中的gobject-introspection,并在构建一些软件包时遇到导入错误。我已经分离出一组步骤最少复制它: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 
    

任何解释?我找不到任何有关预期行为的体面文件,因为gobject-introspection看起来是一个记录很差的项目。非常感谢帮助!

从Python文档:

__init__.py文件都需要使Python视该 目录为一个包;这样做是为了防止 目录具有公共名称(如字符串),无意中隐藏了稍后在模块搜索路径中发生的有效模块。

只需从运行目录访问那些__init__.py文件,就可以告诉解释器这是gi模块的实现。主要gi模块的任何用法都不会正确。

现在,它为什么打印错误来自/usr/lib?因为在local/gi中发现了gi,但在/usr/lib/python2.7/dist-packages/gi/repository中发现了gi.repository。它正在运行/usr/lib/python2.7/dist-packages/gi/repository/__init__.py。从那里,它会正确导入一些其他子模块,但是当它试图导入overrides时,它会在gi/overrides中找到您的本地存根。你的存根没有定义注册表,所以你失败了。

尝试并将registry='dumb_string'放入gi/overrides/__init__.py并查看错误消失。

+0

其实,这是我尝试的第一件事情之一。问题是我实际上需要使用注册表来导入包。因此,如果我稍后尝试从gi存储库导入类似Gtk的东西,则会出现导入错误。从本质上讲,我试图找出正确的方式来做一个特定的gi存储库包的本地覆盖,以这样一种方式,即全球gi存储库信息下降。那有意义吗? – 2013-05-22 16:59:16

+0

那是另一个问题,我不知道如何回答:( 祝你好运! – salicideblock 2013-05-26 14:19:18