Содержимое

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

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

- 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

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