Интерактивная консоль для pyuno + django

Недавно я писал про то, как работать с документами LibreOffice из питона. Я сейчас работаю над исследовательским проектом, в котором django application обращается к LibreOffice через pyuno. В этом проекте натолкнулся на неприятную ошибку - ./manage.py shell при выполнении любых связанных с pyuno методов выдает сообщение “SystemError: pyuno runtime is not initialized, (the pyuno.bootstrap needs to be called before using any uno classes)”. При этом если запустить python и сделать в нем import uno, а потом вызывать те же методы, что и в ./manage.py shell, то все работает отлично, за исключением того, что не получается обращаться к своим моделям (потому что не инициализировано окружение django). Покопавшись в исходниках django.core.management.commands.shell, обнаружил что виноваты две строчки кода:

def handle_noargs(self, **options):
    # XXX: (Temporary) workaround for ticket #1796: force early loading of all
    # models from installed apps.
    from django.db.models.loading import get_models
    loaded_models = get_models()

Если их убрать, то pyuno работает без ошибок. Я написал крохотную django-команду, положил ее в свое приложение (app_name/management/commands/shell.py) и теперь она запускается вместо стандартной:

from django.core.management.commands import shell

class Command(shell.Command):
    def handle_noargs(self, **options):
        self.run_shell()

Единственное требование - должна быть установлена какая-нибудь интерактивная консоль (ipython или bpython).

comments powered by Disqus