переопределения gobject-introspection вызывают ошибки импорта

Я использую gobject-introspection в python2.7 на Ubuntu Raring и сталкиваюсь с ошибкой импорта при создании некоторых пакетов. Я выделил минимальный набор шагов для его воспроизведения:

  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 кажется очень плохо документированным проектом. Помощь приветствуется!


person pre-kidney    schedule 05.05.2013    source источник


Ответы (1)


Из документации Python:

Файлы __init__.py необходимы, чтобы заставить Python рассматривать каталоги как содержащие пакеты; это делается для предотвращения непреднамеренного сокрытия допустимых модулей каталогами с общим именем, например 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 и убедитесь, что ошибка исчезла.

person salicideblock    schedule 21.05.2013
comment
Собственно, это была одна из первых вещей, которые я попробовал. Проблема в том, что мне действительно нужно использовать реестр для импорта пакетов. Поэтому, если я позже попытаюсь импортировать что-то вроде Gtk из репозитория gi, я получу ошибку импорта. По сути, я пытаюсь найти правильный способ локального переопределения конкретного пакета репозитория gi таким образом, чтобы произошла ошибка в информации глобального репозитория gi. Имеет ли это смысл? - person pre-kidney; 22.05.2013
comment
Тогда это другой вопрос, на который я не знаю, как ответить :( Удачи! - person salicideblock; 26.05.2013