Wywoływanie skryptów Pythona z Basic

Możliwe jest wywoływanie skryptów Pythona z makr Collabora Office Basic i uzyskiwanie cennych funkcji, takich jak:

tip

Właściwa znajomość Collabora Office Basic i Application Programming Interface (API) jest zalecana przed wykonaniem wywołań językowych z Basic do Pythona, do JavaScript lub innego silnika skryptowego.


Pobieranie skryptów Pythona

Skrypty Pythona mogą być osobiste, udostępnione lub osadzone w dokumentach. Aby je wykonać, Collabora Office Basic musi mieć zapewnione lokalizacje skryptów Pythona. Lokalizowanie obiektów UNO zgodnych z interfejsem com.sun.star.script.provider.XScript umożliwiają wykonywanie skryptów Pythona:

Option Explicit

Public Function GetPythonScript(macro As String, _
        Optional location As String) As com.sun.star.script.provider.Xscript
    ''' Pobierz obiekt skryptu Pythona przed wykonaniem
    ' Argumenty:
    '    macro   : jako "library/module.py$macro" lub "module.py$macro"
    '    location: jako "document", "share", "user" lub ENUM(eration)
    ' Wynik:
    '    znaleziono usługę 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 ' zgodny z 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

Wykonywanie skryptów Pythona

Struktura skryptów API (Application Programming Interface) Collabora Office obsługuje międzyjęzykowe wykonywanie skryptów między językami Python i Basic lub innymi obsługiwanymi językami programowania. Argumenty mogą być przekazywane tam iz powrotem między wywołaniami, pod warunkiem, że reprezentują prymitywne typy danych rozpoznawane przez oba języki i przy założeniu, że środowisko skryptowe odpowiednio je konwertuje.

Składnia

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out to macierz

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

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

Przykłady skryptów osadzonych

Poniżej procedury ComputerName i GetFilelen wywołują swoje odpowiedniki w Pythonie, używając wspomnianej wcześniej funkcji GetPythonScript. Obsługa wyjątków nie jest szczegółowo opisana.

Option Explicit
Option Compatible ' Właściwości są obsługiwane

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

Private Property Get ComputerName As String
    '''Nazwa stacji roboczej'''
    scr = GetPythonScript("Platform.py$computer_name", "document")
    ComputerName = scr.invoke(Array(), Array(), Array())
End Property ' ComputerName

Private Function GetFilelen(systemFilePath As String) As Currency
    '''Rozmiar pliku w bajtach'''
    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 ' skrypt dokumentu
    ISPERSONAL As String ' skrypt użytkownika
    ISSHARED As String ' makro Collabora Office
End Type ' _SCRIPT_LOCATION

Public Function Script() As Object ' Text enumeration
    Static enums As _SCRIPT_LOCATION : With enums
    If .ISEMBEDDED = "" Then
        .ISEMBEDDED = "document" ' skrypt dokumentu
        .ISPERSONAL = "user" ' skrypty użytkownika
        .ISSHARED = "share" ' makro Collabora Office
    End If : End With ' enums
    Script = enums
End Function ' Script

Wywoływane są dwa różne moduły Pythona. Mogą być osadzone w bieżącym dokumencie lub przechowywane w systemie plików. Sprawdzanie typu argumentu jest pomijane dla przejrzystości:

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

Przykłady skryptów osobistych lub udostępnionych

Mechanizm wywoływania osobistych lub współdzielonych skryptów Pythona jest identyczny jak w przypadku skryptów osadzonych. Nazwy bibliotek są mapowane na foldery. Obliczanie ścieżek plików systemowych profilu użytkownika i udostępnionych modułów Collabora Office można wykonać zgodnie z opisem w Uzyskiwanie informacji o sesji. Poniżej procedury OSName, HelloWorld i NormalizePath wywołują swoje odpowiedniki w Pythonie, używając wspomnianej wcześniej funkcji GetPythonScript. Obsługa wyjątków nie jest szczegółowo opisana.

Option Explicit
Option Compatible ' Właściwości są obsługiwane

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

Private Property Get OSName As String
    '''Nazwa platformy jak "Linux", "Darwin" lub "Windows"'''
    scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
    OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName

Private Sub HelloWorld()
    ''Współdzielone próbki Pythona 'Collabora Office '''
    scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
    scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld

Public Function NormalizePath(systemFilePath As String) As String
    '''Usuń w ścieżce zbędne '\..' '''
    scr = GetPythonScript("Os/Path.py$normalyze", "user")
    NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath

Domyślne moduły Pythona

Program Collabora Office osadzony w języku Python zawiera wiele standardowych bibliotek, z których można czerpać korzyści. Zawierają bogaty zestaw funkcji, takich jak między innymi:

Prosimy o wsparcie!