Inhalte

# Python-Skripte aus Basic aufrufen

Das Aufrufen von Python-Skripten aus LibreOffice Basic-Makros ist möglich und es stehen nützliche Funktionen zur Verfügung, beispielsweise:

- Die Identifikation von ComputerName oder OSName ist möglich,

- Die Basic-Funktionen FileLen() und com.sun.star.ucb.SimpleFileAccess. Die API-Funktion getSize() hat eine Obergrenze von 2 Gigabyte Dateigröße, die mit Python verarbeitet werden kann.

- com.sun.star.util.PathSettings kann normalisiert werden

- und vieles mehr.

Ein angemessener Umgang mit LibreOffice Basic und der Anwendungs-Programmierschnittstelle (API) ist vor der Ausführung von Sprachaufrufen von Basic zu Python, zu JavaScript oder einer anderen Skript-Engine empfehlenswert.

## Python-Skripte abrufen

Python-Skripte können privat, freigegeben oder in Dokumente eingebettet sein. Um sie auszuführen, muss LibreOffice Basic mit Python-Skriptpfaden versehen werden. Das Auffinden von com.sun.star.script.provider.XScript-Interface-kompatiblen UNO-Objekten ermöglicht die Ausführung von Python-Skripten:

             Option Explicit

             Public Function GetPythonScript(macro As String, _
                     Optional location As String) As com.sun.star.script.provider.Xscript
                 ''' Holt sich das Python-Skript-Objekt vor der Ausführung
                 ' Argumente:
                 ' Makro: als "library/module.py$macro" oder "module.py$macro"
                 ' Ort: als "document", "share", "user" oder ENUM(eration)
                 ' Ergebnis:
                 ' findet 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 ' com.sun.star.script.provider.XScriptProvider-kompatibel
                 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-Skripte ausführen

Das Scripting-Framework der LibreOffice-Anwendungsprogrammierschnittstelle (API) unterstützt die Ausführung von Skripten zwischen Python und Basic oder anderen unterstützten Programmiersprachen. Argumente können zwischen Aufrufen hin und her übergeben werden, sofern sie primitive Datentypen darstellen, die von beiden Sprachen erkannt werden, und vorausgesetzt, dass sie vom Scripting-Framework ordnungsgemäß konvertiert werden.

### Syntax

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

opSysName = script.invoke(Matrix(), in_outs, Matrix()) ' in_out ist eine Matrix

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

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

### Beispiele für eingebettete Skripte

Unterhalb der Routinen ComputerName und GetFilelen werden Python-Gegenstücke mit der oben genannten Funktion GetPythonScript aufgerufen. Die Ausnahmebehandlung ist nicht detailliert.

             Option Explicit
             Kompatible Option ' Eigenschaften werden unterstützt

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

             Private Property Get ComputerName As String
                 '''Name der Workstation'''
                 scr = GetPythonScript("Platform.py$computer_name", "document")
                 ComputerName = scr.invoke(Array(), Array(), Array())
             End Property ' ComputerName

             Private Function GetFilelen(systemFilePath As String) As Currency
                 '''Dateigröße in Bytes'''
                 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 ' Dokumentenskript
                 ISPERSONAL As String ' Benutzerskript
                 ISSHARED As String ' LibreOffice-Makro
             End Type ' _SCRIPT_LOCATION

             Public Function Script() As Object ' Text enumeration
                 Static enums As _SCRIPT_LOCATION : With enums
                 If .ISEMBEDDED = "" Then
                     .ISEMBEDDED = "document" ' Dokumentenskript
                     .ISPERSONAL = "user" ' Benutzerskript
                     .ISSHARED = "share" ' LibreOffice-Makro
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

Es werden zwei verschiedene Python-Module aufgerufen. Sie können entweder in das aktuelle Dokument eingebettet oder im Dateisystem gespeichert werden. Die Überprüfung des Argumenttyps wird aus Gründen der Übersichtlichkeit übersprungen:

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

### Beispiele für private oder gemeinsam genutzte Skripte

Der Aufrufmechanismus für private oder gemeinsam genutzte Python-Skripte ist identisch mit dem von eingebetteten Skripten. Bibliotheksnamen werden Ordnern zugeordnet. Die Berechnung der Systemdateipfade für LibreOffice-Anwenderprofile und gemeinsam genutzte Module kann wie in Abrufen von Sitzungsinformationen beschrieben durchgeführt werden. Unterhalb von OSName rufen die Routinen HelloWorld und NormalizePath ihre Python-Gegenstücke mit der oben genannten Funktion GetPythonScript auf. Die Ausnahmebehandlung ist nicht detailliert.

             Option Explicit
             Option Compatible ' Eigenschaften werden unterstützt

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

             Private Property Get OSName As String
                 '''Plattform-Name wie "Linux", "Darwin" oder "Windows"'''
                 scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
                 OSName = scr.invoke(Array(), Array(), Array())
             End Property ' OSName

             Private Sub HelloWorld()
                 '''Beispiel für gemeinsames LibreOffice Python'''
                 scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
                 scr.invoke(Array(), Array(), Array(),)
             End Sub ' HelloWorld

             Public Function NormalizePath(systemFilePath As String) As String
                 '''Überflüssiger Abschnitt '\..' im Pfad'''
                 scr = GetPythonScript("Os/Path.py$normalyze", "user")
                 NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
             End Function ' NormalizePath

## Python-Standardmodule

In LibreOffice eingebettetes Python enthält viele Standardbibliotheken, von denen Sie profitieren können. Sie sind mit zahlreichen Funktionen ausgestattet, unter anderem:

- argparse Parser für Befehlszeilenoptionen, Argumente und Unterbefehle

- cmath Mathematische Funktionen für komplexe Zahlen

- csv CSV-Dateien lesen und schreiben

- datetime Echte Datums- und Zeittypen

- json JSON Encoder und Decoder

- math Mathematische Funktionen

- re Operationen mit regulären Ausdrücken

- socket Low-Level-Netzwerkschnittstelle

- sys System-spezifische Parameter und Funktionen

- unittest und trace Unit-Test-Framework und verfolgen von Python-Ausführungen

- xml.etree.ElementTree ElementTree-XML-API

Verwandte Themen

Basic Makros aus Python aufrufen

LibreOffice Basic-Hilfe

LibreOffice Python-Skripte Hilfe