LibreOffice 24.8 Hjælp
LibreOffice Python-scripts kommer i markante varianter: de kan være personlige, delte eller indlejrede i dokumenter. De lagres på forskellige placeringer, der der beskrevet i Python Scripts Organization and Location (på engelsk). For at importere Python-moduler skal deres placering kendes fra Python på kørselstidspunktet.
Denne mekanisme vises for moduler baseret på filsystem og moduler baseret på et dokument. Håndtering af undtagelser er udeladt for klarhedens skyld. Udtrykkene bibliotek eller katalog, scripts eller moduler bruges i flæng. En Python-makro betegner en funktion i et modul.
Bemærk, at det lokale katalog <User Profile>/Scripts/python/pythonpath altid undersøges, når en Python-makro køres fra <User Profile>/Sripts/python.
Personlige og delte Python-scripts kan importeret, når deres kataloger indgår i Pythons kørselstidssti. Se flere enkeltheder om udeladt Sessionsklasse på siden Hentning af sessionsinformation.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
user_lib = Session().UserPythonScripts # Placering af bruger-scripts
if not user_lib in sys.path:
sys.path.insert(0, user_lib) # Føj til søgesti
import screen_io as ui # 'screen_io.py' modulet findes i user_lib directory
# Din kode følger her
Dette Python-eksempel udsætter en lokal XSCRIPTCONTEXT-variabel for et importeret modul:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, sys
share_lib = Session.SharedPythonScripts() # placering af delte scripts
if not share_lib in sys.path:
sys.path.insert(0, share_lib) # Føj til søgesti
from IDE_utils import ScriptContext # 'IDE_utils.py' findes blandt de delte Python-scripts.
XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
# Din kode følger her
I modsætning til personlige og delte scripts, kan LibreOffice-installationsscripts importeres når som helst. Ligesom uno & unohelper LibreOffice Pythonmoduler, kan andre scripts der findes i kataloget <installation_path>/program importeres direkte, som for eksempel msgbox -modulet.
Med Python-skal:
>>> 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"))
Import af et Python-modul, der er indlejret i et dokument, vises herunder. Der redegøres ikke for fejlhåndtering. Python kørselstidsstien opdateres, når dokumentet er åbnet og før lukning. Se Hændelsesdrevne makroer for at lære, hvordan du knytter Python-makroer til dokumenthændelser.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys, uno
def OnDocPostOpenLoadPython():
""" Forbered import af Pythonmoduler, når doc. er indlæst """
PythonLibraries.loadLibrary('lib/subdir') # Tilføj katalog til søgesti
PythonLibraries.loadLibrary('my_gui', 'screen_io') # Tilføj katalog & importér screen_io
def OnDocQueryCloseUnloadPython():
""" Rens PYTHON_PATH når doc. bliver lukket """
PythonLibraries.unloadLibrary('my_gui') # Rensning af Python kørselstidssti
# Bemærk: importerede moduler forbliver indlæst i dette eksempel.
class PythonLibraries():
""" Python-kataloglæser og modulimportør
tilpasset efter 'Bibliothèque de fonctions' af Hubert Lambert
på https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
def isImportedModule(module_name: str) -> bool:
""" Kontroller listen over kørselstidsmoduler """
return (module_name in sys.modules.keys())
def isLoadedLibrary(lib_name: str) -> bool:
""" kontroller indholdet af PYTHON_PATH """
return (lib_name in sys.path)
def loadLibrary(lib_name: str, module_name=None):
""" tilføj katalog til PYTHON_PATH, importér navngivet modul """
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):
""" fjern katalog fra PYTHON_PATH """
sys.path.remove(lib_name)
g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)