Съдържание

# Импортиране на модули на 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 могат да се импортират във всеки момент. Модулите uno и unohelper на LibreOffice Python, както и други скриптове, присъстващи в директорията <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 за примери на макроси, задействани от събития.