Содержимое

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

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

- Определение ComputerName или OSName;

- Функция Basic FileLen() и функция API com.sun.star.ucb.SimpleFileAccess.getSize() имеют ограничения на работу с файлами размером больше 2 Гигабайт, которые можно преодолеть с помощью Python;

- Нормализация com.sun.star.util.PathSettings;

- и многое другое.

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

- Platform.py

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

             import platform

             def computer_name() -> str:
                 return platform.node()

             def OSname() -> str:
                 return platform.system()

- Os/Path.py

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

- argparse Парсер параметров, аргументов и подкоманд командной строки

- cmath Математические функции для комплексных чисел

- csv Чтение и запись CSV-файлов

- datetime Специализированные типы даты и времени

- json Кодировка и декодировка JSON

- math Математические функции

- re Операции с регулярными выражениями

- socket Низкоуровневый сетевой интерфейс

- sys Системно-зависимые параметры и функции

- unittest и trace Фреймворк для юнит-тестов и отслеживания исполнения кода Python

- xml.etree.ElementTree ElementTree XML API

См. также

Вызов макросов Basic из Python

Справка LibreOffice Basic

Справка по макросам на Python в LibreOffice