Chamar scripts Python desde o Basic

É possível chamar scripts Python a partir de macros do Collabora Office Basic e obter valiosos recursos, tais como:

tip

Recomenda-se certo conhecimento dos recursos do Collabora Office Basic e da interface de programação da aplicação (API) antes de executar as chamadas entre a linguagem Basic para Python, para Javascript, ou qualquer outro motor de scripts.


Receber scripts Python

Os scripts em Python podem ser pessoais, compartilhados ou embutidos em documentos. Para executá-los, o Collabora Office Basic deve conhecer as localidades dos scripts Python. Localizar os objetos UNO que verificam a interface com.sun.star.script.provider.XScript permite a execução de scripts Python:

Option Explicit

Public Function GetPythonScript(macro As String, _
        Optional location As String) As com.sun.star.script.provider.Xscript
    ''' Obter o objeto script Python antes da execução
    ' Argumentos:
    '    macro   : como "library/module.py$macro" ou "module.py$macro"
    '    local: como "document", "share", "user" ou ENUM(eração)
    ' Resultado:
    '    localizado o serviço 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 ' compatível com 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

Executar scripts em Python

A Interface de Programação de Aplicações (API) Scripting Framework do Collabora Office suporta a execução de scripts inter-linguagem entre Python e o Basic, ou demais linguagens suportadas. Os argumentos podem ser passados para frente ou de volta entre chamadas, desde que representem tipo de dados primitivos que ambas linguagens reconheçam, e assumindo que o Scripting Framework faça a conversão adequadamente.

Sintaxe

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out é um Array

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

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

Exemplos de scripts embutidos em documentos

As rotinas ComputerName, e GetFilelen abaixo chamam suas contrapartidas em Python, utilizando a função GetPythonScript. O tratamento de exceções não é detalhado aqui.

Option Explicit
Option Compatible ' Propriedades tem suporte

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

Private Property Get ComputerName As String
    '''Nome da 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
    '''Tamanho do arquivo em 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 ' script do documento
    ISPERSONAL As String ' script do usuário
    ISSHARED As String ' Macro do 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" ' script do document
        .ISPERSONAL = "user" ' script do usuário
        .ISSHARED = "share" ' Macro do Collabora Office
    End If : End With ' enums
    Script = enums
End Function ' Script

São chamados dois módulos Python diferentes. Podem ser embutidos no documento atual ou armazenados no sistema de arquivos. Por clareza, omitiu-se a verificação dos argumentos:

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

Exemplos de scripts pessoais ou compartilhados

O mecanismo de chamadas aos scripts Python pessoais ou compartilhados é idêntico ao dos scripts embutidos. Os nomes de bibliotecas são mapeados em pastas. Pode-se computar os caminhos do perfil do usuário do Collabora Office e dos módulos compartilhados em Obter informação da sessão. As rotinas OSName, HelloWorld e NormalizePath abaixo chamam suas contrapartidas em Python, utilizando a função GetPythonScript. O tratamento de exceções não foi detalhado.

Option Explicit
Option Compatible ' Propriedades são suportadas

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

Private Property Get OSName As String
    '''Nome de plataforma, como «Linux», «Darwin» ou «Windows»'''
    scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
    OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName

Private Sub HelloWorld()
    '''exemplo de Collabora Office Python compartilhado'''
    scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
    scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld

Public Function NormalizePath(systemFilePath As String) As String
    '''Eliminar '\..' supérfluo no caminho'''
    scr = GetPythonScript("Os/Path.py$normalyze", "user")
    NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath

Módulos Python padrão

O Python incluso no Collabora Office contém muitas bibliotecas padrão para proveito. Carregam um rico conjunto de recursos, tais que e não limitados a:

♥ Doe para nosso projeto! ♥