Содержимое

# Импорт модулей Python

Сценарии Python в LibreOffice могут быть трёх типов: пользовательские, общие и встроенные в документы. Они хранятся в разных местах, описанных в разделе Организация и размещение сценариев Python. Для импорта модулей Python место их размещения должно быть известно интерпретатору Python во время выполнения.

Этот механизм проиллюстрирован на примере модулей, расположенных в файловой системе, и модулей, встроенных в документы. Обработка исключений пропущена для наглядности. Термины «библиотека» и «каталог», «сценарии» и «модули» в данном тексте равнозначны. Макрос Python представляет собой функцию внутри модуля.

Обратите внимание, что локальный каталог <User Profile>/Scripts/python/pythonpath всегда просматривается при запуске макроса Python из <User Profile>/Scripts/python.

## Импорт модуля из файловой системы

Библиотеки LibreOffice Basic содержат классы, процедуры и переменные, а модули Python — классы, функции и переменные. Общие фрагменты многократно используемых функций Python или UNO следует сохранять в области хранения Мои макросы в (Профиль пользователя)/Scripts/python/pythonpath. Библиотеки Python помогают структурировать модули, предотвращая конфликты имён. В общих модулях необходимо выполнять импорт uno.py.

### Пользовательские или общие модули

Импорт пользовательских и общих сценариев Python возможен после добавления их каталогов в путь поиска Python во время выполнения. См. более подробную информацию на странице Получение информации о сеансе в описании импорта недостающего класса Session.

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import sys

            user_lib = Session().UserPythonScripts  # Место расположения пользовательского сценария
            if not user_lib in sys.path:
                sys.path.insert(0, user_lib)  # Добавление в путь поиска
            import screen_io as ui  # модуль 'screen_io.py' находится в каталоге user_lib
            # Здесь можно вставить свой код

В этом примере на языке Python демонстрируется передача локальной переменной XSCRIPTCONTEXT в импортированный модуль:

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import uno, sys

            share_lib = Session.SharedPythonScripts()  # Место расположения общих сценариев
            if not share_lib in sys.path:
                sys.path.insert(0, share_lib)  # Добавление в путь поиска
            from IDE_utils import ScriptContext  # 'IDE_utils.py' находится в месте размещения общих сценариев Python.
            XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
            # Здесь можно вставить свой код

### Установочные модули для приложений

В отличие от пользовательских и общих сценариев, установочные сценарии LibreOffice можно импортировать когда угодно. Наряду с модулями Python uno и unohelper, другие сценарии, находящиеся в каталоге <installation_path>/program, такие как модуль msgbox, могут импортироваться напрямую.

С помощью командной оболочки Python:

>>> import msgbox, uno

>>> myBox = msgbox.MsgBox(uno.getComponentContext())

>>> myBox.addButton("okay")

>>> myBox.renderFromButtonSize()

>>> myBox.numberOflines = 2

>>> print(myBox.show("A small message",0,"Dialog title"))

## Импорт встроенных модулей

Ниже показан импорт встроенного в документ модуля Python. Обработка ошибок не детализирована. Путь поиска во время исполнения Python обновляется после открытия документа и перед его закрытием. См. Макросы, управляемые событиями, чтобы узнать, как назначать макросы Python событиям документа.

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals

            import sys, uno, zipimport

            def OnDocPostOpenLoadPython(event = None):
                """ Подготовьте импорт модулей Python после загрузки док-та """
                PythonLibraries.loadLibrary('lib/subdir')  # Добавление каталога в путь поиска
                PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Добавление каталога и импорт screen_io

            def OnDocQueryCloseUnloadPython(event = None):
                """ Очистка PYTHON_PATH при закрытии док-та """
                PythonLibraries.unloadLibrary('my_gui')  # Очистка путей библиотеки в среде выполнения Python
                # Примечание: в данном примере импортированные модули остаются загруженными.

            class PythonLibraries():
                """ Загрузчик библиотеки Python и импортировщик модулей

                основано на 'Bibliothèque de fonctions' (Библиотека функций) от Hubert Lambert
                на https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
                def isImportedModule(module_name: str) -> bool:
                    """ Проверка списка модулей среды выполнения """
                    return (module_name in sys.modules.keys())
                def isLoadedLibrary(lib_name: str) -> bool:
                    """ Проверка содержимого PYTHON_PATH """
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    return (url in sys.path)
                def loadLibrary(lib_name: str, module_name=None):
                    """ добавление каталога в PYTHON_PATH, импорт указанного модуля """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    if not url in sys.path:
                        sys.path.insert(0, url)
                    if module_name and not module_name in sys.modules.keys():
                        return zipimport.zipimporter(url).load_module(module_name)
                def unloadLibrary(lib_name: str):
                    """ удаление каталога из PYTHON_PATH """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    sys.path.remove(url)

            g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)

См. также

Получение информации о сеансе

Программирование с использованием сценариев Python

Организация и размещение сценариев Python

См. примеры макросов, управляемых событиями, в разделе Создание слушателя Python.

Пожалуйста, поддержите нас!