От Basic към Python

Съдържание
Индекс 🔎︎

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

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

- извличане на името на компютъра и операционната система с ComputerName и OSName,

- преодоляване на ограничението от 2 гигабайта за размер на файла във функцията FileLen() на Basic и com.sun.star.ucb.SimpleFileAccess. getSize() с помощта на Python,

- нормализиране на пътищата от com.sun.star.util.PathSettings,

- и много други.

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

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

Скриптовете на Python могат да бъдат лични, споделени или вградени в документи. За да ги стартира, LibreOfficeDev 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) на LibreOfficeDev поддържа многоезиково изпълнение между 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 ' Макрос на LibreOfficeDev
             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" ' Макрос на LibreOfficeDev
                 End If : End With ' enums
                 Script = enums
             End Function ' Script

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

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

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

Механизмът на обръщенията към лични или споделени скриптове на Python е идентичен с този за вградени скриптове. Имената на библиотеки съответстват на папки. Системните файлови пътища до потребителския профил в LibreOfficeDev и споделените модули могат да се намерят както е показано в Получаване на информация за сесията. По-долу 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()
                 '''Пример за споделен скрипт на LibreOfficeDev 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 на LibreOfficeDev съдържа множество полезни стандартни библиотеки. Ето някои от предлаганите от тях възможности:

- argparse синтактичен анализ на параметри, аргументи и подкоманди на командния ред

- cmath математически функции за комплексни числа

- csv четене и записване на CSV файлове

- datetime истински типове за дата и час

- json кодиране и декодиране на JSON

- math математически функции

- re операции с регулярни изрази

- socket мрежов интерфейс на ниско ниво

- sys зависими от системата параметри и функции

- unittest и trace среда за компонентно тестване, проследяване изпълнението на Python

- xml.etree.ElementTree ElementTree API за XML

Теми, свързани с показаната

Обръщения към макроси на Basic от Python

Помощ за LibreOfficeDev Basic

Помощ за скриптовете на Python в LibreOfficeDev