Вызов сценариев 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

The LibreOffice Application Programming Interface (API) Scripting Framework supports inter-language script execution between Python and Basic, or other supported programming languages for that matter. Arguments can be passed back and forth across calls, provided that they represent primitive data types that both languages recognize, and assuming that the Scripting Framework converts them appropriately.

Синтаксис

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 содержит множество стандартных библиотек, которыми можно воспользоваться. Они обладают богатым набором функций, таких как, но не ограничиваясь:

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

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