Python Modules Importeren
LibreOffice Python-scripts zijn er in drie verschillende smaken, ze kunnen persoonlijk zijn, worden gedeeld of ingebed in documenten. Ze worden opgeslagen op verschillende plaatsen die worden beschreven inPython Scripts Organization and Location. Om Python-modules te kunnen importeren, moeten hun locaties tijdens runtime van Python bekend zijn.
Dit mechanisme wordt geïllustreerd voor op bestandssysteem gebaseerde modules en op documenten gebaseerde modules. Behandeling van uitzonderingen is voor de duidelijkheid weggelaten. De termen bibliotheek of map, scripts of modules worden door elkaar gebruikt. Een Python-macro verwijst naar een functie in een module.
Merk op dat de lokale map <User Profile>/Scripts/python/pythonpath altijd wordt verkend bij het uitvoeren van een Python-macro van <User Profile>/Scripts/python.
Bestandsysteemmodule importeren
Gebruiker of gedeelde modules
Persoonlijke en gedeelde Python-scripts kunnen worden geïmporteerd als hun directory's zijn opgenomen in het Python-tijdpad. Raadpleeg Informatie over sessie-informatie voor meer informatie over weggelaten sessieklasse.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
ser_lib = Session().UserPythonScripts # Locatie gebruiker scripts
if not user_lib in sys.path:
sys.path.insert(0, user_lib) # Voeg toe aan zoekpad
import screen_io as ui # 'screen_io.py' module bevindt zich in user_lib map
# Uw code volgt hier
Dit Python voorbeeld maakt een lokale XSCRIPTCONTEXT variabele beschikbaar voor een geïmporteerde module:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, sys
share_lib = Session.SharedPythonScripts() # Locatie gedeelde scripts
if not share_lib in sys.path:
sys.path.insert(0, share_lib) # Voeg toe aan zoekpad
from IDE_utils import ScriptContext # 'IDE_utils.py' zit met gedeelde Python scripts.
XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
# Uw code volgt hier
Modules voor toepassingen installeren
In tegenstelling tot persoonlijke en gedeelde scripts, kunnen LibreOffice installatie scripts op elk moment worden geïmporteerd. Naast uno & unohelper LibreOffice Python modules, kunnen andere scripts die zich bevinden in de <installation_path>/program map, ook rechtstreeks worden geïmporteerd, zoals bijvoorbeeld de msgbox module.
Met Python shell:
>>> 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"))
Document module importeren
Het importeren van een Python document embedded module is hieronder weergegeven. Foutafhandeling is niet gedetailleerd. Het uitvoerpad van Python wordt geüpdatet als een document wordt geopend en voordat deze wordt gesloten. Verwijs naar Gebeurtenissen Gestuurde Macros om te leren hoe Python macros zijn te associëren met document gebeurtenissen.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys, uno
def OnDocPostOpenLoadPython():
""" Bereidt het importeren van Python modules voor als doc. wordt geladen """
PythonLibraries.loadLibrary('lib/subdir') # Voeg map toe aan zoekpad
PythonLibraries.loadLibrary('my_gui', 'screen_io') # Voeg map & import screen_io toe
def OnDocQueryCloseUnloadPython():
""" Ruim PYTHON_PATH op, zodra doc. wordt gesloten """
PythonLibraries.unloadLibrary('my_gui') # Python uitvoerpad opruiming
# Let op: geïmporteerde modules blijven geladen in dit voorbeeld..
class PythonLibraries():
""" Python bibliotheek lader en module importeur
aangepast vanuit 'Bibliothèque de fonctions' door Hubert Lambert
op https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
def isImportedModule(module_name: str) -> bool:
""" Check run time module list """
return (module_name in sys.modules.keys())
def isLoadedLibrary(lib_name: str) -> bool:
""" Controleer inhoud PYTHON_PATH """
return (lib_name in sys.path)
def loadLibrary(lib_name: str, module_name=None):
""" Voeg map toe aan PYTHON_PATH, importeer genoemde module """
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):
""" Verwijder map uit PYTHON_PATH """
sys.path.remove(lib_name)
g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)