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:

tip

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:


         # -*- coding: utf-8 -*-
         from __future__ import unicode_literals
          
         import platform
          
         def computer_name() -> str:
             return platform.node()
          
         def OSname() -> str:
             return platform.system()
      

         # -*- 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-Benutzerprofile 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:

Bitte unterstützen Sie uns!