Извикване на скриптове на Python от Basic

Възможно е от макроси на LibreOffice Basic да се извикват скриптове на Python, което дава достъп до полезна функционалност, например:

tip

Препоръчва се преди да използвате междуезикови обръщения от Basic към Python, JavaScript или друга скриптова машина да сте се запознали в достатъчна степен с LibreOffice Basic и функциите на интерфейса за приложно програмиране (API).


Извличане на скриптове на Python

Скриптовете на Python могат да бъдат лични, споделени или вградени в документи. За да ги стартира, LibreOffice Basic трябва да разполага с местоположенията им. Намирането на UNO обекти, реализиращи интерфейса com.sun.star.script.provider.XScript, позволява изпълняването на скриптове на Python:


         Option Explicit
             
         Public Function GetPythonScript(macro As String, _
                 Optional location As String) As com.sun.star.script.provider.Xscript
             ''' Вземаме обект за скрипт на Python преди изпълнението
             ' Аргументи:
             '    macro   : например "library/module.py$macro" или "module.py$macro"
             '    location: например "document", "share", "user" или стойност от ENUM
             ' Резултат:
             '    намерена 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 ' Съвместим с 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
      

Изпълнение на скриптове на Python

Обкръжението за скриптове (Scripting Framework) на интерфейса за приложно програмиране (API) на LibreOffice поддържа многоезиково изпълнение между Python и Basic, както и между други езици. При обръщенията могат да се предават аргументи в двете посоки, стига да представят разпознавани и от двата езика примитивни типове данни, които Scripting Framework е в състояние да преобразува правилно.

Синтаксис

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

opSysName = script.invoke(Array(), in_outs, Array()) ' in_out е масив

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

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

Примери за вградени скриптове

По-долу ComputerName и GetFilelen викат съответствията си от Python чрез споменатата функция GetPythonScript. Обработката на изключения не е показана.


         Option Explicit
         Option Compatible ' Поддържат се свойства
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get ComputerName As String
             '''Име на компютъра'''
             scr = GetPythonScript("Platform.py$computer_name", "document")
             ComputerName = scr.invoke(Array(), Array(), Array())
         End Property ' ComputerName
             
         Private Function GetFilelen(systemFilePath As String) As Currency
             '''Размер на файл в байтове'''
             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 ' Скрипт в документ
             ISPERSONAL As String ' Потребителски скрипт
             ISSHARED As String ' Макрос на LibreOffice
         End Type ' _SCRIPT_LOCATION
             
         Public Function Script() As Object ' Text enumeration
             Static enums As _SCRIPT_LOCATION : With enums
             If .ISEMBEDDED = "" Then
                 .ISEMBEDDED = "document" ' Скрипт в документ
                 .ISPERSONAL = "user" ' Потребителски скрипт
                 .ISSHARED = "share" ' Макрос на LibreOffice
             End If : End With ' enums
             Script = enums
         End Function ' Script
      

Извикват се два различни модула на Python. Те могат или да са вградени в текущия документ, или да се съхраняват във файловата система. За простота е пропусната проверката на типа на аргументите:


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

Примери за лични или споделени скриптове

Механизмът на обръщенията към лични или споделени скриптове на Python е идентичен с този за вградени скриптове. Имената на библиотеки съответстват на папки. Системните файлови пътища до потребителския профил в LibreOffice и споделените модули могат да се намерят както е показано в Получаване на информация за сесията. По-долу OSName, HelloWorld и NormalizePath извикват съответствията си на Python чрез споменатата функция GetPythonScript. Обработката на изключения не е показана.


         Option Explicit
         Option Compatible ' Поддържат се свойства
             
         Private scr As Object ' com.sun.star.script.provider.XScript
             
         Private Property Get OSName As String
             '''Име на платформа, например "Linux", "Darwin" или "Windows"'''
             scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
             OSName = scr.invoke(Array(), Array(), Array()) 
         End Property ' OSName
             
         Private Sub HelloWorld()
             '''Пример за споделен скрипт на LibreOffice Python'''
             scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
             scr.invoke(Array(), Array(), Array(),)
         End Sub ' HelloWorld
             
         Public Function NormalizePath(systemFilePath As String) As String
             '''Премахване на излишното '\..' от пътя'''
             scr = GetPythonScript("Os/Path.py$normalyze", "user")
             NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
         End Function ' NormalizePath
      

Стандартни модули на Python

Вграденият Python на LibreOffice съдържа множество полезни стандартни библиотеки. Ето някои от предлаганите от тях възможности:

Моля, подкрепете ни!