Вызов сценариев Python из Basic

Из макросов LibreOffice Basic возможно вызывать сценарии Python, можно получить такие полезные функции, как:

Значок подсказки

Прежде выполнения межъязыковых вывозов из Basic в Python, JavaScript или любой другой обработчик сценариев рекомендуется ознакомиться с функциями LibreOffice Basic и Application Programming Interface (API).


Получение сценариев Python

Сценарии Python могут быть локальными, разделяемыми или вложенными в документы. Для их выполнения необходимо передать LibreOffice Basic информацию о их расположении. После получения ссылки на объекты UNO, совместимые с интерфейсом com.sun.star.script.provider.XScript, сценарии Python можно исполнять:


         Option Explicit
             
         Public Function GetPythonScript(macro As String, _
                 Optional location As String) As com.sun.star.script.provider.Xscript
             ''' Захват объекта сценария Python перед выполнением
             ' Аргументы:
             '    макрос   : как "library/module.py$macro" или "module.py$macro"
             '    область размещения: как "document" (вложенный), "share" (разделяемый), "user" (локальный) или ENUM (перечисление)
             ' Результат:
             '    ссылка на службу UNO com.sun.star.script.provider.XScript'''
             If IsMissing(location) Then location = "user"
             Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
             Dim sp As Object ' совместим с com.sun.star.script.provider.XScriptProvider
             Dim uri As String
             If location="document" Then
                 sp = ThisComponent.getScriptProvider()
             Else
                 mspf = CreateUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
                 sp = mspf.createScriptProvider("")
             End If
             uri = "vnd.sun.star.script:"& macro &"?language=Python&location="& location
             GetPythonScript = sp.getScript(uri)
         End Function ' GetPythonScript
      

Выполнение сценариев Python

Среда выполнения сценариев LibreOffice API поддерживает выполнение сценариев с возможностью межъязыкового вызова между Python и Basic, а также между другими поддерживаемыми для этих задач языками программирования. Возможен двусторонний обмен аргументами через вызовы, с учётом принадлежности этих аргументов к основным типам данных, распознаваемых обоими языками, и при условии, что среда выполнения сценариев осуществляет их надлежащее преобразование.

Синтаксис

workstation_name = script.invoke(Array(), Array(), Array())

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out — массив

file_len = script.invoke(Array(systemFilePath), Array(), Array())

normalizedPath = script.invoke(Array(systemFilePath), Array(), Array())

Примеры вложенных сценариев

Представленные внизу процедуры ComputerName и GetFilelen обращаются к соответствующим обработчикам Python посредством вышеупомянутых функций GetPythonScript. Обработка исключения не детализирована.


         Option Explicit
         Option Compatible ' Свойства не поддерживаются
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get ComputerName As String
             '''Имя рабочей станции'''
             scr = GetPythonScript("Platform.py$computer_name", "document")
             ComputerName = scr.invoke(Array(), Array(), Array())
         End Property ' ComputerName
             
         Private Function GetFilelen(systemFilePath As String) As Currency
             '''Размер файла в байтах'''
             scr = GetPythonScript("Os/Path.py$get_size", Script.ISEMBEDDED)
             GetFilelen = scr.invoke(Array(systemFilePath), Array(), Array(),)
         End Function ' GetFilelen
             
         Private Type _SCRIPT_LOCATION
             ISEMBEDDED As String ' вложенный сценарий
             ISPERSONAL As String ' локальный сценарий
             ISSHARED As String ' макрос LibreOffice
         End Type ' _SCRIPT_LOCATION
             
         Public Function Script() As Object ' Text enumeration
             Static enums As _SCRIPT_LOCATION : With enums
             If .ISEMBEDDED = "" Then
                 .ISEMBEDDED = "document" ' вложенный сценарий
                 .ISPERSONAL = "user" ' локальный сценарий
                 .ISSHARED = "share" ' макрос LibreOffice
             End If : End With ' enums
             Script = enums
         End Function ' Script
      

Вызываются два разных модуля Python. Они могут быть либо вложены в текущий документ, либо храниться в файловой системе. Проверка типа аргумента пропускается здесь для большей ясности:


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
          
         import platform
          
         def computer_name() -> str:
             return platform.node()
          
         def OSname() -> str:
             return platform.system()
      

         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
          
         import os.path
          
         def get_size(systemFilePath: str) -> str:
             return str(os.path.getsize(systemFilePath))
          
         def normalyze(systemPath: str) -> str:
             return os.path.normpath(systemPath)
      

Примеры локальных или разделяемых сценариев

Механизм вызова локальных или разделяемых сценариев Python идентичен вложенным сценариям. Имена библиотек сопоставлены с папками. Определение профиля пользователя LibreOffice и путей к системным файлам общих модулей может выполняться согласно описанию в Получение информации о сеансе. Представленные ниже процедуры OSName, HelloWorld и NormalizePath вызывают функции Python с помощью упомянутой выше функции GetPythonScript. Обработка исключений не детализирована.


         Option Explicit
         Option Compatible ' Свойства поддерживаются
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get OSName As String
             '''Имя платформы в виде строки "Linux", "Darwin" или "Windows"'''
             scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
             OSName = scr.invoke(Array(), Array(), Array()) 
         End Property ' OSName
             
         Private Sub HelloWorld()
             '''Образец кода Python для LibreOffice'''
             scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
             scr.invoke(Array(), Array(), Array(),)
         End Sub ' HelloWorld
             
         Public Function NormalizePath(systemFilePath As String) As String
             '''Вырезать избыточные символы '\..' в пути'''
             scr = GetPythonScript("Os/Path.py$normalyze", "user")
             NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
         End Function ' NormalizePath
      

Стандартные модули Python

Встроенный Python LibreOffice содержит множество стандартных библиотек, которыми можно воспользоваться. Они обладают богатым набором функций, таких как, но не ограничиваясь:

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

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