Задать вопрос
Alex_Geer
@Alex_Geer
System Engineer

Почему не находит модуль Base при использовании модуля uno?

Всем привет. Написал макрос для обновления оглавления через libreoffice на python. Для этого использую библиотеку uno. Но при отработке выдает ошибку что модуль Base не найден. Не могу понять в чем проблема.
2025-01-10 05:05:02 - src.loading_and_processing_xml - INFO - [loading_and_processing_xml.py:402] - LibreOffice запущен в фоновом режиме
Traceback (most recent call last):
  File "/app/src/libreoffice_macro.py", line 1, in <module>
    import uno
  File "/usr/local/lib/python3.13/site-packages/uno/__init__.py", line 4, in <module>
    from base import Element, Css, Payload, UnoBaseFeature, UnoBaseField
ModuleNotFoundError: No module named 'base'
2025-01-10 05:05:04 - src.loading_and_processing_xml - ERROR - [loading_and_processing_xml.py:415] - Ошибка при обновлении оглавления

Макрос

import uno
import sys
from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
from com.sun.star.text import XTextContent

def update_table_of_contents(doc_path):
    # Получаем локальный контекст
    local_context = uno.getComponentContext()
    
    # Создаем UNO менеджер соединений
    resolver = local_context.ServiceManager.createInstanceWithContext(
        "com.sun.star.bridge.UnoUrlResolver", local_context)
    
    try:
        # Подключаемся к запущенному процессу LibreOffice
        context = resolver.resolve(
            "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
        desktop = context.ServiceManager.createInstanceWithContext(
            "com.sun.star.frame.Desktop", context)
        
        # Открываем документ
        doc = desktop.loadComponentFromURL(
            uno.systemPathToFileUrl(doc_path), "_blank", 0, ())
        
        # Получаем все индексы в документе
        indexes = doc.getDocumentIndexes()
        
        # Обновляем каждый индекс
        for i in range(indexes.getCount()):
            index = indexes.getByIndex(i)
            if index.supportsService("com.sun.star.text.ContentIndex"):
                index.update()
        
        # Сохраняем и закрываем документ
        doc.store()
        doc.close(True)
        
    except Exception as e:
        print(f"Ошибка при обновлении оглавления: {str(e)}", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Использование: python libreoffice_macro.py <путь_к_документу>", file=sys.stderr)
        sys.exit(1)
    
    update_table_of_contents(sys.argv[1])

  • Вопрос задан
  • 46 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Alex_Geer
@Alex_Geer Автор вопроса
System Engineer
Спасибо коллеге из комментариев. Пришел к такому выводу.
В файле с макросом сделал следующий импорт.
import sys
sys.path.append("/usr/lib/python3/dist-packages")
sys.path.append("/usr/lib/libreoffice/program")

# Инициализируем окружение UNO
import uno

# Импортируем необходимые компоненты
from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
from com.sun.star.text import XTextContent
from com.sun.star.beans import PropertyValue
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы