Vsebina

# Klicanje skriptov Python iz Basica

Skripte Python lahko kličete iz makrov LibreOffice Basic, s čimer pridobite pomembne funkcionalnosti, kot so:

- možna je identifikacija imena računalnika (ComputerName) in operacijskega sistema (OSName),

- funkcija Basic FileLen() in funkcija API com.sun.star.ucb.SimpleFileAccess.getSize() imata zgornjo mejo velikosti datotek 2 Gb, ki jo s Pythonom lahko zaobidete,

- normalizirate lahko com.sun.star.util.PathSettings

- in številne druge.

Priporočljivo je, da se dobro spoznate z jezikom LibreOffice Basic in vmesnikom Application Programming Interface (API), preden se iz skripte v Basicu sklicujete na Python, JavaScript ali drug skriptni mehanizem.

## Pridobivanje skriptov v jeziku Python

Skripti Python so lahko zasebni, v skupni rabi ali vdelani v dokumente. Da bi jih izvajali, mora LibreOffice Basic poznati lokacije skriptov Python. Izvajanje skriptov Python omogočite z iskanjem predmetov UNO, ki so skladni z vmesnikom com.sun.star.script.provider.XScript:

             Option Explicit

             Public Function GetPythonScript(macro As String, _
                     Optional location As String) As com.sun.star.script.provider.Xscript
                 ''' Zagrabi predmet skripta Python pred izvajanjem
                 ' Argumenti:
                 '    macro/makro   : kot "library/module.py$macro" ali "module.py$macro"
                 '    location/mesto: kot "document", "share", "user" ali ENUM(eration/oštevilčenje)
                 ' Rezultat:
                 '    locirana UNO-storitev 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 ' Združljivo 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

## Izvajanje skriptov Python

Ogrodje skriptov vmesnika programiranja LibreOffice API (angl. Application Programming Interface) podpira izvajanje skriptov med Pythonom in Basicom ter drugimi podprtimi programskimi jeziki. Argumente lahko podajate skozi klice, če gre za primitivne vrste podatkov, ki jih prepoznata oba jezika, in če jih ogrodje API ustrezno pretvori.

### Skladnja

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

imeOpSistema = script.invoke(Array(), in_outs, Array()) ' in_outs je matrika

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

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

### Primeri vdelanih skriptov

Spodnji rutini ComputerName in GetFilelen kličeta svoja ekvivalenta v Pythonu z uporabo prej omenjene funkcije GetPythonScript. Izjeme niso podrobno obravnavane.

             Option Explicit
             Option Compatible ' Lastnosti so podprte

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

             Private Property Get ComputerName As String
                 '''Ime delovne postaje'''
                 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 datoteke v bajtih'''
                 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 iz dokumenta
                 ISPERSONAL As String ' skript uporabnika
                 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 As String ' skript iz dokumenta
                     .ISPERSONAL = "user" ' skripti uporabnika
                     .ISSHARED = "share" ' Makro LibreOffice
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

Klicana sta dva različna modula Python. Lahko sta vdelana v trenutni dokument ali shranjena v datotečnem sistemu. Preverjanje vrste argumentov je zavoljo jasnosti preskočeno:

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

### Primeri osebnih skriptov in skriptov v skupni rabi

Mehanizem za klicanje zasebnih ali skupnih skriptov Python je identičen tistemu za vdelane skripte. Imena knjižnic se preslikajo v mape. Izračun uporabniškega profila LibreOffice in datotečnih poti do modulov v skupni rabi je možno opraviti po navodilih Pridobivanje informacij o seji. Spodnji podprogrami OSName, HelloWorld in NormalizePath kličejo svoje ekvivalente v Pythonu z uporabo prej omenjene funkcije GetPythonScript. Izjeme niso podrobno obravnavane.

             Option Explicit
             Option Compatible ' Lastnosti so podprte

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

             Private Property Get OSName As String
                 '''Ime platforme kot »Linux«, »Darwin« ali »Windows«'''
                 scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
                 OSName = scr.invoke(Array(), Array(), Array())
             End Property ' OSName

             Private Sub HelloWorld()
                 '''Vzorec LibreOffice Python v skupni rabi'''
                 scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
                 scr.invoke(Array(), Array(), Array(),)
             End Sub ' HelloWorld

             Public Function NormalizePath(systemFilePath As String) As String
                 '''Odstrani odvečne '\..' v poti'''
                 scr = GetPythonScript("Os/Path.py$normalyze", "user")
                 NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
             End Function ' NormalizePath

## Standardni moduli Python

V LibreOffice vdelani Python vsebuje številne standardne knjižnice, ki so vam lahko v pomoč, saj obsegajo bogat nabor funkcij, kot so:

- argparse Razčlenjevalnik možnosti, argumentov in podukazov ukazne vrstice

- cmath Matematične funkcije s kompleksnimi števili

- csv Branje in pisanje datotek CSV

- datetime Prave vrste datuma in časa

- json Kodirnik in dekodirnik JSON

- math Matematične funkcije

- re Operacije regularnih izrazov

- socket Omrežni vmesnik nižje ravni

- sys Sistemski parametri in funkcije

- unittest in trace Ogrodje preizkušanja enot in sledenja izvajanja Pythona

- xml.etree.ElementTree API XML ElementTree

Podobne teme

Klicanje makrov Basic s Pythonom

Pomoč za LibreOffice Basic

Pomoč LibreOffice za skripte v jeziku Python