De BASIC a Python

Contingut

# Cridar scripts de Python des de Basic

És possible cridar scripts de Python des de macros de LibreOffice Basic, i es poden obtenir funcionalitats interessants com ara:

- es possible identificar el ComputerName i la detecció de l'OSName,

- La funció de Basic FileLen() i com.sun.star.ucb.SimpleFileAccess. getSize() de l'API tenen una mida màxima de 2 Gigabytes que Python ajuda a superar,

- Es pot normalitzar com.sun.star.util.PathSettings,

- i moltes més.

És recomanable familiaritzar-se amb les funcionalitats BASIC de LibreOffice i la interfície de programació d'aplicacions (API) abans de fer crides de BASIC a Python, JavaScript o un altre motor de scripts.

## Recuperació de scripts en Python

Els scripts de Python poden ser personals, compartits o estar incrustats en els documents. Per a executar-los, s'han d'incloure les ubicacions dels scripts de Python a LibreOffice Basic. Localitzar els objectes UNO compatibles amb la interfície com.sun.star.script.provider.XScript permet que s'executin els scripts de Python:

             Option Explicit

             Public Function GetPythonScript(macro As String, _
                     Optional location As String) As com.sun.star.script.provider.Xscript
                 ''' Obteniu l'objecte d'script de Python abans de l'execució
                 ' Arguments:
                 '    macro   : com a «library/module.py$macro» o «module.py$macro»
                 '····location: com a «document», «share», «user» o ENUM(eració)
                 ' Resultat:
                 '    s'ha localitzat el servei com.sun.star.script.provider.XScript d'UNO'''
                 If IsMissing(location) Then location = "user"
                 Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
                 Dim sp As Object ' compatible amb 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

## Execució de scripts en Python

La interfície de programació d'aplicacions (API) de LibreOffice, admet l'execució de scripts entre llenguatges Python i Basic, o altres llenguatges de programació compatibles. Els arguments es poden passar en els dos sentits de les crides sempre que representin tipus de dades primitius que els dos llenguatges reconeguin, i assumint que l'entorn de scripts els converteix de manera adequada.

### Sintaxi

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out és una matriu

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

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

### Exemples de scripts incrustats

Les rutines ComputerName i GetFilelen criden als seus homòlegs Python utilitzant la funció GetPythonScript abans esmentada. La gestió d'excepcions no s'ha detallat.

             Option Explicit
             Opció Compatible ' S'admeten les propietats

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

             Private Property Get ComputerName As String
                 '''Nom de l'estació de treball'''
                 scr = GetPythonScript("Platform.py$computer_name", "document")
                 ComputerName = scr.invoke(Array(), Array(), Array())
             End Property ' ComputerName

             Private Function GetFilelen(systemFilePath As String) As Currency
                 '''Mida del fitxer en 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 del document
                 ISPERSONAL As String ' script d'usuari
                 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 del document
                     .ISPERSONAL = "user" ' scripts d'usuari
                     .ISSHARED = "share" ' macro del LibreOffice
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

Es criden dos mòduls Python diferents. Es poden incrustar al document actual o bé emmagatzemar-se en el sistema de fitxers. S'omet la comprovació del tipus d'argument per a més claredat:

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

### Exemples de scripts personals o compartits

El mecanisme de crida per a scripts personals o compartits de Python és idèntic al dels scripts incrustats. Els noms de les biblioteques estan assignats a carpetes. El càlcul del perfil d'usuari del LibreOffice i les rutes als fitxer dels mòduls compartits del sistema, es pot realitzar tal com es detalla en Obtenir informació de la sessió. Les rutines OSName, HelloWorld i NormalizePath descrites a sota criden llurs homòlegs en Python, fent servir la funció GetPythonScript abans esmentada. La gestió d'excepcions no es detalla aquí.

             Option Explicit
             Opció Compatible ' Propietats admeses

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

             Private Property Get OSName As String
                 '''El nom d'una plataforma, com ara «Linux», «Darwin» o «Windows»'''
                 scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
                 OSName = scr.invoke(Array(), Array(), Array())
             End Property ' OSName

             Private Sub HelloWorld()
                 '''exemple compartit de Python a LibreOffice'''
                 scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
                 scr.invoke(Array(), Array(), Array(),)
             End Sub ' HelloWorld

             Public Function NormalizePath(systemFilePath As String) As String
                 '''Elimina el «\..» superflu de la ruta'''
                 scr = GetPythonScript("Os/Path.py$normalyze", "user")
                 NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
             End Function ' NormalizePath

## Mòduls estàndards de Python

El Python incrustat a LibreOffice conté moltes biblioteques estàndard de les quals beneficiar-se. Tenen un ric conjunt de funcionalitats com ara, i entre altres:

- argparse Analitzador per a les opcions, arguments i subordres de línia d'ordres

- cmath: funcions matemàtiques per a nombres complexos

- csv: lectura i escriptura de fitxers CSV

- datetime: tipus de data i hora genuïns

- json: codificador i descodificador de JSON

- math: funcions matemàtiques

- re: operacions amb expressions regulars

- socket: interfície de xarxes de baix nivell

- sys: paràmetres i funcions específiques del sistema

- unittest i trace: entorn de proves unitàries i seguiment d'execució per a Python

- xml.etree.ElementTree: API d'ElementTree XML

Temes relacionats

Crida a macros Basic des de Python

8LibreOffice Ajuda bàsica

Ajuda dels scripts de Python a LibreOffice