Kalde Python-scripts fra Basic

Kalde Python-scripts fra LibreOffice Basic makroer er muligt, og værdifulde funktioner kan opnås, så som:

tip

Et fornuftig kendskab til LibreOffice Basic og til Application Programming Interface (API)-funktioner er anbefalet, før du giver dig i kast med kald fra Basic til Python, til JavaScript eller andre typer scripts.


Hente Python-scripts

Python-scripts kan være personlige, delte eller indlejret i dokumenter. For at kunne udløse dem, skal LibreOffice Basic udstyres med Python-scriptets placering. Ved hjælp af com.sun.star.script.provider.XScript interface-kompatible UNO-objekter tillader udførelse af Python-scripts:


         Option Explicit
             
         Public Function GetPythonScript(macro As String, _
                 Optional location As String) As com.sun.star.script.provider.Xscript
             ''' Fang Python-script objekt før udførelsen
             ' Argumenter:
             '    makro   : som "library/module.py$macro" eller "module.py$macro"
             '    placering: som "document", "share", "user" eller ENUM(eration)
             ' Resultat:
             '    ved 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
      

Udløse Python-scripts

LibreOffice Application Programming Interface (API) Scripting-netværket understøtter mellemsproglige script-udførelse mellem Python og Basic eller andre understøttede programerede sprog for den sags skyld. Argumenter kan passere frem på tværs af kald, forudsat at de repræsenterer primitive data-typer, som begge programmer genkender, og antaget at Scripting-miljøet konverterer den passende.

Syntaks

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out er et array

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

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

Eksempler med indlejrede scripts

Herunder vil ComputerName, og GetFilelen- rutiner blive kaldt med deres Python-version ved hjælp af førnævnte GetPythonScript-funktion. Håndtering af afvigelser er ikke detaljeret i eksemplerne.


         Option Explicit
         Option Compatible ' Egenskaber understøttes
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get ComputerName As String
             '''Maskinens navn'''
             scr = GetPythonScript("Platform.py$computer_name", "document")
             ComputerName = scr.invoke(Array(), Array(), Array())
         End Property ' ComputerName
             
         Private Function GetFilelen(systemFilePath As String) As Currency
             '''Filstørrelse i 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 ' dokument-script
             ISPERSONAL As String ' bruger-script
             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" ' dokument-script
                 .ISPERSONAL = "user" ' bruger-scripts
                 .ISSHARED = "share" ' LibreOffice -makro
             End If : End With ' enums
             Script = enums
         End Function ' Script
      

To forskellige Python-moduler kaldes. De kan enten integreres i det aktuelle dokument, eller lagres pĂĄ filsystemet. Kontrol af argumenttype udelades fra eksemplerne for klarhedens skyld:


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

Eksempler med personlige eller delte scripts

Opkaldsmekanismen for personlige og delte Python-scripts er identisk med den for indlejrede scripts. Biblioteksnavne kortlægges til mapper. Beregning af% PRODUCTNAME brugerprofil og delte moduler systemfilstier kan udføres som beskrevet i Hente sessionsinformationer. OSName, HelloWorld og NormalizePath rutiner herunder kalder deres Python modstykker ved brug af førnævnte GetPythonScript-funktion. Håndtering af afvigelser er ikke detaljerede i eksemplerne.


         Option Explicit
         Option Compatible ' Egenskaber understøttes
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get OSName As String
             '''Platformsnavn som "Linux", "Darwin" eller "Windows"'''
             scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
             OSName = scr.invoke(Array(), Array(), Array()) 
         End Property ' OSName
             
         Private Sub HelloWorld()
             '''Eksempel med LibreOffice Python delte'''
             scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
             scr.invoke(Array(), Array(), Array(),)
         End Sub ' HelloWorld
             
         Public Function NormalizePath(systemFilePath As String) As String
             '''Fjern overflødige '\..' i sti'''
             scr = GetPythonScript("Os/Path.py$normalyze", "user")
             NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
         End Function ' NormalizePath
      

Python standardmoduler

LibreOffice indlejret Python har mange standardbiblioteker du kan drage nytte af. De tilbyder en række funktioner så som (men ikke begrænset til):

Støt os venligst!