Chamar scripts Python desde o Basic

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

tip

Recomenda-se certo conhecimento dos recursos do LibreOffice 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 LibreOffice 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 LibreOffice 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 LibreOffice
         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 LibreOffice
             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 LibreOffice 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 LibreOffice 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 LibreOffice 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! ♥