Conteúdo
Índice 🔎︎

# Chamar scripts Python desde o Basic

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

- Possibilidade de identificar o ComputerName ou detectar o OSName,

- A função Basic FileLen() e função API com.sun.star.ucb.SimpleFileAccess.getSize() apresentam o limite de tamanho de 2 GB que o Python pode superar,

- com.sun.star.util.PathSettings pode ser normalizado,

- e muito mais.

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 Application Programming Interface (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:

- Platform.py

             # -*- coding: utf-8 -*-
             from __future__ import unicode_literals

             import platform

             def computer_name() -> str:
                 return platform.node()

             def OSname() -> str:
                 return platform.system()

- Os/Path.py

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

- argparse Analisador de opções da linha de comando, argumentos e subcomandos

- cmath Funções matemáticas para números complexos

- csv Leitura e gravação de arquivos CSV

- datetime Tipos de data e hora genuínos

- json Codificador e decodificador JSON

- math Funções matemáticas

- re operações com expressões regulares

- socket interface de rede de baixo nível

- sys parâmetros e funções específicos do sistema

- unittest e trace framework de unidades de teste e tracking de execução do Python

- xml.etree.ElementTree API de XML ElementTree

Tópicos relacionados

Chamar macros Basic pelo Python

Ajuda do LibreOffice Basic

Ajuda dos scripts Python do LibreOffice