Da Basic a Python

Contenuto
Indice 🔎︎

# Richiamare script Python da Basic

È possibile richiamare script Python dalle LibreOffice macro di Basic e si possono ottenere valide funzioni, come ad esempio:

- la possibilità di identificazione ComputerNameo di rilevazione OSName

- le funzioni Basic FileLen() e API com.sun.star.ucb.SimpleFileAccess. getSize() presentano un limite superiore di dimensione del file di 2 Gigabyte che Python consente di superare,

- la possibilità di normalizzazione di com.sun.star.util.PathSettings

- e molte altre ancora.

È consigliabile un adeguato approccio a LibreOffice Basic e ad Application Programming Interface (API) prima di eseguire funzioni di chiamata tra linguaggi Basic, Python, JavaScript o qualsiasi altro motore di script.

## Richiamo degli script Python

Gli script Python possono essere personali, condivisi o incorporati nei documenti. Per poterli eseguire, LibreOffice Basic deve disporre della posizione degli script Python. L'individuazione di oggetti UNO compatibili con l'interfaccia com.sun.star.script.provider.XScript consente l'esecuzione di script Python:

             Option Explicit

             Public Function GetPythonScript(macro As String, _
                     Optional location As String) As com.sun.star.script.provider.Xscript
                 ''' Recupera l'oggetto di script Python prima dell'esecuzione
                 ' Argomenti:
                 '    macro   : come "library/module.py$macro" o "module.py$macro"
                 '    location: come "document", "share", "user" o ENUM(eration)
                 ' Risultato:
                 '    individuato il servizio di 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 ' compatibile con 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

## Esecuzione degli script Python

L'API (Application Programming Interface) Scripting Framework di LibreOffice supporta l'esecuzione di script tra linguaggi Python e Basic o altri linguaggi di programmazione supportati. Gli argomenti possono essere passati avanti e indietro tra le chiamate, a condizione che rappresentino tipi di dati primitivi riconosciuti da entrambi i linguaggi e che la Scripting Framework li converta in modo appropriato.

### Sintassi

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out è una matrice

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

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

### Esempi di script incorporati

Le routine seguenti ComputerName e GetFilelen richiamano le corrispondenti controparti Python mediante la funzione GetPythonScript precedentemente menzionata. La gestione delle eccezioni non è dettagliata.

             Option Explicit
             Option Compatible ' Sono supportate le proprietà

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

             Private Property Get ComputerName As String
                 '''Nome 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
                 '''Dimensione file in byte'''
                 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 documento
                 ISPERSONAL As String ' script utente
                 ISSHARED As String ' macro di 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 documento
                     .ISPERSONAL = "user" ' script utente
                     .ISSHARED = "share" ' macro di LibreOffice
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

Vengono richiamati due diversi moduli Python. Possono essere incorporati nel documento corrente o memorizzati nel file system. Il controllo del tipo di argomento per chiarezza viene tralasciato:

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

### Esempi di script personali o condivisi

Il meccanismo di chiamata per script Python personali o condivisi è identico a quello degli script incorporati. I nomi delle librerie sono mappati in cartelle. L'elaborazione del profilo utente LibreOffice e dei percorsi dei file di sistema relativi ai moduli condivisi si possono eseguire come descritto in Ottenere informazioni sulla sessione. Le routine seguenti OSName, HelloWorld e NormalizePath richiamano le corrispondenti controparti Python mediante la funzione GetPythonScript precedentemente menzionata. La gestione delle eccezioni non è dettagliata.

             Option Explicit
             Option Compatible ' Sono supportate le proprietà

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

             Private Property Get OSName As String
                 '''Nome piattaforma come "Linux", "Darwin" o "Windows"'''
                 scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
                 OSName = scr.invoke(Array(), Array(), Array())
             End Property ' OSName

             Private Sub HelloWorld()
                 '''Esempio condiviso Python di LibreOffice'''
                 scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
                 scr.invoke(Array(), Array(), Array(),)
             End Sub ' HelloWorld

             Public Function NormalizePath(systemFilePath As String) As String
                 '''Estrae le '\..' superflue nel percorso'''
                 scr = GetPythonScript("Os/Path.py$normalyze", "user")
                 NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
             End Function ' NormalizePath

## Moduli Python standard

I moduli Python incorporati in LibreOffice contengono molte librerie standard da cui trarre vantaggio. Offrono una ricca gamma di funzioni, comprese, ma non esclusivamente, le seguenti:

- argparse Parser per opzioni a riga di comando, argomenti e sottocomandi

- cmath Funzioni matematiche per numeri complessi

- csv Lettura e scrittura di file CSV

- datetime Tipi di data e ora di base

- json Codificatore e decodificatore JSON

- math Funzioni matematiche

- re Operazioni di espressione regolare

- socket Interfaccia di rete di basso livello

- sys Parametri e funzioni specifiche del sistema

- unittest e trace Unit testing framework e Track Python execution

- xml.etree.ElementTree API ElementTree XML

Argomenti correlati

Richiamare macro Basic da Python

Guida di LibreOffice Basic

Guida agli script Python di LibreOffice