Obsah

# Volání skriptů Pythonu z Basicu

Z maker LibreOffice Basic je možné volat skripty Pythonu a díky tomu lze přistupovat k užitečným funkcím jako například:

- je možné zjistit ComputerName nebo OSName,

- funkce Basicu FileLen() a funkce API com.sun.star.ucb.SimpleFileAccess.getSize() jsou omezeny maximální velikostí souboru 2 GB, zatímco v Pythonu se lze tomuto omezení vyhnout,

- lze normalizovat com.sun.star.util.PathSettings

- a k mnohým dalším.

Pokud chcete volat volat z jazyka LibreOffice Basic jazyky jiné (Python, JavaScript nebo jiný skriptovací jazyk), je vhodné, abyste měli odpovídající znalost Basicu a rozhraní pro programování aplikací (API).

## Získávání skriptů Pythonu

Skripty Pythonu mohou být osobní, sdílené nebo vložené v dokumentech. Chcete-li je spouštět, je nutné jazyku LibreOffice Basic poskytnout informaci o jejich umístění. Toho dosáhnete pomocí rozhraní com.sun.star.script.provider.XScript, které odpovídá objektům UNO:

             Option Explicit

             Public Function GetPythonScript(macro As String, _
                     Optional location As String) As com.sun.star.script.provider.Xscript
                 ''' Před spuštěním získá objekt se skriptem Pythonu
                 ' Argumenty:
                 '    macro   : jako "library/module.py$macro" nebo "module.py$macro"
                 '    location: jako "document", "share", "user" nebo ENUM(eration)
                 ' Výsledek:
                 '    služba UNO com.sun.star.script.provider.XScript s umístěním'''
                 If IsMissing(location) Then location = "user"
                 Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
                 Dim sp As Object ' kompatibilní s 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

## Spouštění skriptů Pythonu

Za tím účelem skriptovací rozhraní z rozhraní pro programování aplikací (API) LibreOffice umožňuje spouštění skriptů mezi Pythonem a Basicem, případně mezi dalšími podporovanými programovacími jazyky. Ve voláních lze předávat oběma směry argumenty za předpokladu, že se jedná o primitivní datové typy rozpoznatelné oběma jazyky a že je skriptovací rozhraní umí správně převést.

### Syntaxe

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out je typu Array

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

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

### Příklady vložených skriptů

Níže uvedené programy ComputerName a GetFilelen volají odpovídající kód v Pythonu, a to s využitím výše zmíněné funkce GetPythonScript. V kódu není uvažováno zpracování chyb.

             Option Explicit
             Option Compatible ' zapnutí podpory Properties

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

             Private Property Get ComputerName As String
                 '''Název počítače'''
                 scr = GetPythonScript("Platform.py$computer_name", "document")
                 ComputerName = scr.invoke(Array(), Array(), Array())
             End Property ' ComputerName

             Private Function GetFilelen(systemFilePath As String) As Currency
                 '''Velikost souboru v bajtech'''
                 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 ' skript v dokumentu
                 ISPERSONAL As String ' uživatelský skript
                 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" ' skript v dokumentu
                     .ISPERSONAL = "user" ' uživatelský skript
                     .ISSHARED = "share" ' makro LibreOffice
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

Volají se dva různé moduly Pythonu. Tu mohou být buď vloženy do aktuálního dokumenty, nebo být uloženy v souborovém systému. Pro přehlednost je vynechána kontrola typu argumentů:

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

### Příklady osobních nebo sdílených skriptů

Způsob volání osobních nebo sdílených skriptů Pythonu je stejný jako u vložených skriptů. Názvy knihoven jsou namapovány na složky. Cesty k souborům uživatelského profilu LibreOffice a sdílených modulů lze zjistit tak, jak je popsáno na stránce Zjišťování informací o relaci. Níže uvedené programy OSName, HelloWorld a NormalizePath volají odpovídající kód v Pythonu, a to s využitím výše zmíněné funkce GetPythonScript. V kódu není uvažováno zpracování chyb.

             Option Explicit
             Option Compatible ' zapnutí podpory Properties

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

             Private Property Get OSName As String
                 '''Název platformy jako "Linux", "Darwin" nebo "Windows"'''
                 scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
                 OSName = scr.invoke(Array(), Array(), Array())
             End Property ' OSName

             Private Sub HelloWorld()
                 '''Příklad sdíleného skriptu Pythonu v LibreOffice'''
                 scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
                 scr.invoke(Array(), Array(), Array(),)
             End Sub ' HelloWorld

             Public Function NormalizePath(systemFilePath As String) As String
                 '''Odstraní z řetězce s cestou nadbytečné '\..''''
                 scr = GetPythonScript("Os/Path.py$normalyze", "user")
                 NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
             End Function ' NormalizePath

## Standardní moduly Pythonu

Python, který je součástí LibreOffice, obsahuje řadu užitečných standardních knihoven, které pokrývají širokou škálu funkcí. Mimo jiné se jedná o knihovny:

- argparse Syntaktický analyzátor možností, argumentů a příkazů zadaných v příkazovém řádku

- cmath Matematické funkce pro komplexní čísla

- csv Načítání a ukládání souborů CSV

- datetime Opravdové typy data a času

- json Vytváření a zpracovávání formátu JSON

- math Matematické funkce

- re Operace s regulárními výrazy

- socket Nízkoúrovňové síťové rozhraní

- sys Parametry a funkce specifické pro systém

- unittest a trace Prostředí pro jednotkové testy a sledování běhu programu v Pythonu

- xml.etree.ElementTree ElementTree API pro formát XML

Související témata

Volání maker Basicu z Pythonu

Nápověda LibreOffice Basic

Nápověda pro skripty Pythonu v LibreOffice