Извикване на скриптове на Python от Basic

Възможно е от макроси на Collabora Office Basic да се извикват скриптове на Python, което дава достъп до полезна функционалност, например:

tip

Препоръчва се преди да използвате междуезикови обръщения от Basic към Python, JavaScript или друга скриптова машина да сте се запознали в достатъчна степен с Collabora Office Basic и функциите на интерфейса за приложно програмиране (API).


Извличане на скриптове на Python

Скриптовете на Python могат да бъдат лични, споделени или вградени в документи. За да ги стартира, Collabora Office Basic трябва да разполага с местоположенията им. Намирането на UNO обекти, реализиращи интерфейса com.sun.star.script.provider.XScript, позволява изпълняването на скриптове на Python:

Option Explicit

Public Function GetPythonScript(macro As String, _
        Optional location As String) As com.sun.star.script.provider.Xscript
    ''' Вземаме обект за скрипт на Python преди изпълнението
    ' Аргументи:
    '    macro   : например "library/module.py$macro" или "module.py$macro"
    '    location: например "document", "share", "user" или стойност от ENUM
    ' Резултат:
    '    намерена UNO услуга 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 ' Съвместим с 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

Изпълнение на скриптове на Python

Обкръжението за скриптове (Scripting Framework) на интерфейса за приложно програмиране (API) на Collabora Office поддържа многоезиково изпълнение между Python и Basic, както и между други езици. При обръщенията могат да се предават аргументи в двете посоки, стига да представят разпознавани и от двата езика примитивни типове данни, които Scripting Framework е в състояние да преобразува правилно.

Синтаксис

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out е масив

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

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

Примери за вградени скриптове

По-долу ComputerName и GetFilelen викат съответствията си от Python чрез споменатата функция GetPythonScript. Обработката на изключения не е показана.

Option Explicit
Option Compatible ' Поддържат се свойства

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

Private Property Get ComputerName As String
    '''Име на компютъра'''
    scr = GetPythonScript("Platform.py$computer_name", "document")
    ComputerName = scr.invoke(Array(), Array(), Array())
End Property ' ComputerName

Private Function GetFilelen(systemFilePath As String) As Currency
    '''Размер на файл в байтове'''
    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 ' Скрипт в документ
    ISPERSONAL As String ' Потребителски скрипт
    ISSHARED As String ' Макрос на 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" ' Скрипт в документ
        .ISPERSONAL = "user" ' Потребителски скрипт
        .ISSHARED = "share" ' Макрос на Collabora Office
    End If : End With ' enums
    Script = enums
End Function ' Script

Извикват се два различни модула на Python. Те могат или да са вградени в текущия документ, или да се съхраняват във файловата система. За простота е пропусната проверката на типа на аргументите:

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

Примери за лични или споделени скриптове

Механизмът на обръщенията към лични или споделени скриптове на Python е идентичен с този за вградени скриптове. Имената на библиотеки съответстват на папки. Системните файлови пътища до потребителския профил в Collabora Office и споделените модули могат да се намерят както е показано в Получаване на информация за сесията. По-долу OSName, HelloWorld и NormalizePath извикват съответствията си на Python чрез споменатата функция GetPythonScript. Обработката на изключения не е показана.

Option Explicit
Option Compatible ' Поддържат се свойства

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

Private Property Get OSName As String
    '''Име на платформа, например "Linux", "Darwin" или "Windows"'''
    scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
    OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName

Private Sub HelloWorld()
    '''Пример за споделен скрипт на Collabora Office Python'''
    scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
    scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld

Public Function NormalizePath(systemFilePath As String) As String
    '''Премахване на излишното '\..' от пътя'''
    scr = GetPythonScript("Os/Path.py$normalyze", "user")
    NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath

Стандартни модули на Python

Вграденият Python на Collabora Office съдържа множество полезни стандартни библиотеки. Ето някои от предлаганите от тях възможности:

Моля, подкрепете ни!