Spis treści

# Wywoływanie skryptów Pythona z Basic

Możliwe jest wywoływanie skryptów Pythona z makr LibreOffice Basic i uzyskiwanie cennych funkcji, takich jak:

- możliwa identyfikacja ComputerName lub OSName,

- funkcja Basic FileLen() i funkcja API com.sun. star.ucb.SimpleFileAccess.getSize() wyświetlają górny limit rozmiaru pliku 2 gigabajty, który Python pomaga pokonać,

- możliwa do znormalizowania com.sun.star.util.PathSettings,

- i wiele więcej.

Właściwa znajomość LibreOffice Basic i Application Programming Interface (API) jest zalecana przed wykonaniem wywołań językowych z Basic do Pythona, do JavaScript lub innego silnika skryptowego.

## Pobieranie skryptów Pythona

Skrypty Pythona mogą być osobiste, udostępnione lub osadzone w dokumentach. Aby je wykonać, LibreOffice Basic musi mieć zapewnione lokalizacje skryptów Pythona. Lokalizowanie obiektów UNO zgodnych z interfejsem com.sun.star.script.provider.XScript umożliwiają wykonywanie skryptów Pythona:

             Option Explicit

             Public Function GetPythonScript(macro As String, _
                     Optional location As String) As com.sun.star.script.provider.Xscript
                 ''' Pobierz obiekt skryptu Pythona przed wykonaniem
                 ' Argumenty:
                 '    macro   : jako "library/module.py$macro" lub "module.py$macro"
                 '    location: jako "document", "share", "user" lub ENUM(eration)
                 ' Wynik:
                 '    znaleziono usługę com.sun.star.script.provider.XScript UNO service'''
                 If IsMissing(location) Then location = "user"
                 Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
                 Dim sp As Object ' zgodny z 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

## Wykonywanie skryptów Pythona

Struktura skryptów API (Application Programming Interface) LibreOffice obsługuje międzyjęzykowe wykonywanie skryptów między językami Python i Basic lub innymi obsługiwanymi językami programowania. Argumenty mogą być przekazywane tam iz powrotem między wywołaniami, pod warunkiem, że reprezentują prymitywne typy danych rozpoznawane przez oba języki i przy założeniu, że środowisko skryptowe odpowiednio je konwertuje.

### Składnia

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out to macierz

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

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

### Przykłady skryptów osadzonych

Poniżej procedury ComputerName i GetFilelen wywołują swoje odpowiedniki w Pythonie, używając wspomnianej wcześniej funkcji GetPythonScript. Obsługa wyjątków nie jest szczegółowo opisana.

             Option Explicit
             Option Compatible ' Właściwości są obsługiwane

             Private scr As Object ' com.sun.star.script.provider.XScript

             Private Property Get ComputerName As String
                 '''Nazwa stacji roboczej'''
                 scr = GetPythonScript("Platform.py$computer_name", "document")
                 ComputerName = scr.invoke(Array(), Array(), Array())
             End Property ' ComputerName

             Private Function GetFilelen(systemFilePath As String) As Currency
                 '''Rozmiar pliku w bajtach'''
                 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 ' skrypt dokumentu
                 ISPERSONAL As String ' skrypt użytkownika
                 ISSHARED As String ' makro LibreOffice
             End Type ' _SCRIPT_LOCATION

             Public Function Script() As Object ' Text enumeration
                 Static enums As _SCRIPT_LOCATION : With enums
                 If .ISEMBEDDED = "" Then
                     .ISEMBEDDED = "document" ' skrypt dokumentu
                     .ISPERSONAL = "user" ' skrypty użytkownika
                     .ISSHARED = "share" ' makro LibreOffice
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

Wywoływane są dwa różne moduły Pythona. Mogą być osadzone w bieżącym dokumencie lub przechowywane w systemie plików. Sprawdzanie typu argumentu jest pomijane dla przejrzystości:

- 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)

### Przykłady skryptów osobistych lub udostępnionych

Mechanizm wywoływania osobistych lub współdzielonych skryptów Pythona jest identyczny jak w przypadku skryptów osadzonych. Nazwy bibliotek są mapowane na foldery. Obliczanie ścieżek plików systemowych profilu użytkownika i udostępnionych modułów LibreOffice można wykonać zgodnie z opisem w Uzyskiwanie informacji o sesji. Poniżej procedury OSName, HelloWorld i NormalizePath wywołują swoje odpowiedniki w Pythonie, używając wspomnianej wcześniej funkcji GetPythonScript. Obsługa wyjątków nie jest szczegółowo opisana.

             Option Explicit
             Option Compatible ' Właściwości są obsługiwane

             Private scr As Object ' com.sun.star.script.provider.XScript

             Private Property Get OSName As String
                 '''Nazwa platformy jak "Linux", "Darwin" lub "Windows"'''
                 scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
                 OSName = scr.invoke(Array(), Array(), Array())
             End Property ' OSName

             Private Sub HelloWorld()
                 ''Współdzielone próbki Pythona 'LibreOffice '''
                 scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
                 scr.invoke(Array(), Array(), Array(),)
             End Sub ' HelloWorld

             Public Function NormalizePath(systemFilePath As String) As String
                 '''Usuń w ścieżce zbędne '\..' '''
                 scr = GetPythonScript("Os/Path.py$normalyze", "user")
                 NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
             End Function ' NormalizePath

## Domyślne moduły Pythona

Program LibreOffice osadzony w języku Python zawiera wiele standardowych bibliotek, z których można czerpać korzyści. Zawierają bogaty zestaw funkcji, takich jak między innymi:

- argparse Parser opcji wiersza poleceń, argumentów i poleceń podrzędnych

- cmath Funkcje matematyczne liczb zespolonych

- csv Odczytywanie i zapisywanie plików CSV

- datetime Prawdziwe typy daty i czasu

- json Koder i dekoder JSON

- math Funkcje matematyczne

- re Operacje wyrażeń regularnych

- socket Interfejs sieciowy niskiego poziomu

- sys Parametry i funkcje specyficzne systemu

- unittest i trace Framework do testów jednostkowych i śledzenie wykonywania Pythona

- xml.etree.ElementTree API XML ElementTree

Tematy pokrewne

Wywoływanie makr Basic z Pythona

Pomoc LibreOffice Basic

Pomoc skryptów Pythona LibreOffice