Conteúdo

# Invocar scripts Python a partir do Basic

Também é possível invocar scripts Python nas macros do LibreOffice Basic e incluir mais recursos tais como:

- Possibilidade de identificar o valor de ComputerName ou OSName ,

- As funções Basic FileLen() e com.sun.star.ucb.SimpleFileAccess.getSize() da API têm um tamanho máximo de 2 GB que podem ser ultrapassado utilizando Python,

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

- e muito mais.

É recomendado que esteja familiarizado com as características do LibreOffice Basic e com a interface de programação da aplicação (API) antes de realizar chamadas de códigos entre da linguagem Basic para Python, JavaScript ou outras linguagens de scripts.

## Obter scripts Python

Os scripts em Python podem ser pessoais, partilhados ou incorporados em documentos. Para os executar, o LibreOffice Basic tem que saber quais as localizações 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 objecto de script Python antes da execução
                 Argumentos ':
                 '    macro   : como "library/module.py$macro" ou "module.py$macro"
                 '    local: como "document", "share", "user" ou ENUM(eration)
                 ' 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 Python

A estrutura de scripts da Interface de Programação de Aplicações (API) LibreOffice suporta a execução de scripts entre linguagens, nomeadamente entre Python e Basic, ou outras linguagens de programação compatíveis. Os argumentos podem ser transmitidos entre chamadas, desde que representem tipos de dados primitivos reconhecidos por ambas as linguagens e partindo do princípio de que a estrutura de scripts os converte 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 incorporados em documentos

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

             Option Explicit
             Option Compatible ' Suporta propriedades

             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 ficheiro 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 utilizador
                 ISSHARED As String ' Macro de 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 documento
                     .ISPERSONAL = "user" ' script do utilizador
                     .ISSHARED = "share" ' Macro de LibreOffice
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

São chamados dois módulos Python diferentes. Podem ser incluídos no documento atual ou guardados no sistema de ficheiros. 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 partilhados

O mecanismo de chamadas para scripts Python pessoais ou partilhados é idêntico ao dos scripts incluídos. Os nomes de bibliotecas são mapeados em pastas. O cálculo dos caminhos do perfil de utilizador do LibreOffice e dos ficheiros de sistema dos módulos artilhados pode ser feito como indicado em Obter informação da sessão. As rotinas OSName, HelloWorld e NormalizePath chamam as suas contrapartidas em Python, utilizando a função GetPythonScript. O tratamento de exceções não é detalhado.

             Option Explicit
             Option Compatible ' Suporta propriedades

             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 Python partilhado em LibreOffice'''
                 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. Disponibilizam um vasto conjunto de funcionalidades, tais como mas 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 ficheiros CSV

- datetime Tipos de data e hora genuínos

- json Codificador e descodificador 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 Estrutura de unidades de teste e de execução Python

- xml.etree.ElementTree API de XML ElementTree

Tópicos relacionados

Invocar macros Basic via Python

LibreOffice Ajuda básica

Ajuda para os scripts Python no LibreOffice

Necessitamos da sua ajuda!