4

我在 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
    

有什么解释吗?我找不到任何关于预期行为的体面文档,因为 gobject-introspection 似乎是一个文档记录非常差的项目。非常感谢您的帮助!

4

1 回答 1

1

来自 Python 文档:

需要这些__init__.py文件才能使 Python 将目录视为包含包;这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏了稍后出现在模块搜索路径上的有效模块。

只需__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看看错误消失了。

于 2013-05-21T16:23:20.193 回答