Помощ за Collabora Office 24.04
Скриптовете на Python в Collabora Office са три отделни вида: лични, споделени или вградени в документи. Те се съхраняват на различни места, описани в Организация и местоположение на скриптовете на Python. За да импортирате модули на Python, местоположенията им трябва да са известни в Python по време на изпълнение.
Този механизъм е илюстриран за модули, базирани на файловата система, и за модули в документи. Обработката на изключения е пропусната за яснота. Термините „библиотека“ и „директория“, както и „скриптове“ и „модули“ са използвани като синоними. Под „макрос на Python“ се разбира функция в модул.
Обърнете внимание, че локалната директория <User Profile>/Scripts/python/pythonpath винаги се експортира при изпълнение на макрос на Python от <User Profile>/Scripts/python.
Личните и споделените скриптове на Python могат да бъдат импортирани, след като директориите им бъдат включени в пътя за изпълнение на Python. Вижте страницата Получаване на информация за сесията за повече подробности относно пропуснатия клас Session.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
user_lib = Session().UserPythonScripts # Местоположение на скриптовете на потребителя
if not user_lib in sys.path:
sys.path.insert(0, user_lib) # Добавяме към пътя за търсене
import screen_io as ui # Модулът 'screen_io.py' се намира в директорията user_lib
# Тук следва вашият код
Този пример на Python предоставя локална променлива XSCRIPTCONTEXT на импортиран модул:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, sys
share_lib = Session.SharedPythonScripts() # Местоположение на споделените скриптове
if not share_lib in sys.path:
sys.path.insert(0, share_lib) # Добавяме към пътя за търсене
from IDE_utils import ScriptContext # 'IDE_utils.py' е при споделените скриптове на Python.
XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
# Тук следва вашият код
За разлика от личните и споделените скриптове, инсталационните скриптове на Collabora Office могат да се импортират във всеки момент. Модулите uno и unohelper на Collabora Office Python, както и други скриптове, присъстващи в директорията <installation_path>/program, могат да бъдат импортирани директно, например модулът msgbox.
С обвивката на Python:
>>> import msgbox, uno
>>> myBox = msgbox.MsgBox(uno.getComponentContext())
>>> myBox.addButton("okay")
>>> myBox.renderFromButtonSize()
>>> myBox.numberOflines = 2
>>> print(myBox.show("A small message",0,"Dialog title"))
Импортирането на вграден в документ модул на Python е илюстрирано по-долу. Обработката на грешки не е показана. Пътят за изпълнение на Python се обновява при отваряне и затваряне на документ. Вижте Макроси, задействани от събития за това как да свържете макроси на Python със събития в документ.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys, uno
def OnDocPostOpenLoadPython():
""" Подготвяне импортирането на модул на Python при зареждане на документа """
PythonLibraries.loadLibrary('lib/subdir') # Добавяме директорията към пътя за търсене
PythonLibraries.loadLibrary('my_gui', 'screen_io') # Добавяме директорията и импортираме screen_io
def OnDocQueryCloseUnloadPython():
""" Изчистване на PYTHON_PATH при затваряне на документа """
PythonLibraries.unloadLibrary('my_gui') # Почистваме пътя за изпълнение на Python
# Бележка: в този пример импортираните модули остават заредени.
class PythonLibraries():
""" Кодът за зареждане на библиотеки и импортиране на модули на Python
е адаптиран от „Bibliothèque de fonctions“ от Юбер Ламбер (Hubert Lambert)
на адрес https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
def isImportedModule(module_name: str) -> bool:
""" Проверка на списъка на изпълняваните модули """
return (module_name in sys.modules.keys())
def isLoadedLibrary(lib_name: str) -> bool:
""" Проверка на съдържанието на PYTHON_PATH """
return (lib_name in sys.path)
def loadLibrary(lib_name: str, module_name=None):
""" Добавяне на директорията в PYTHON_PATH, импортиране на наименувания модул """
doc = XSCRIPTCONTEXT.getDocument()
url = uno.fileUrlToSystemPath(
'{}/{}'.format(doc.URL,'Scripts/python/'+lib_name)
if not url in sys.path:
sys.path.insert(0, url)
if module_name and not module_name in sys.modules.keys():
return zipimport.zipimporter(url).load_module(module_name)
def unloadLibrary(lib_name: str):
""" Премахване на директорията от PYTHON_PATH """
sys.path.remove(lib_name)
g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)