Importer des modules Python
Les scripts Python de LibreOffice se dĂ©clinent en trois versions distinctes, ils peuvent ĂȘtre personnels, partagĂ©s ou intĂ©grĂ©s dans des documents. Ils sont stockĂ©s Ă diffĂ©rents endroits dĂ©crits dans Python Scripts Organization and Location. Afin d'importer des modules Python, leurs emplacements doivent ĂȘtre connus depuis Python au moment de l'exĂ©cution.
Ce mécanisme est illustré pour les modules basés sur le systÚme de fichiers et les modules basés sur les documents. La gestion des exceptions est omise par souci de clarté. Les termes bibliothÚque ou répertoire, scripts ou modules sont utilisés de maniÚre interchangeable. Une macro Python fait référence à une fonction dans un module.
Notez que <User Profile>/Scripts/python/pythonpath répertoire local est toujours exploré lors de l'exécution d'une macro Python de <User Profile>/Scripts/python.
Import du module systĂšme de fichiers
Modules utilisateur ou partagés
Les scripts Python personnels et partagĂ©s peuvent ĂȘtre importĂ©s une fois que leurs rĂ©pertoires sont inclus dans le chemin d'exĂ©cution Python. Reportez-vous Ă la page Obtenir des informations de session pour plus de dĂ©tails sur la classe de session omise.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
user_lib = Session().UserPythonScripts # emplacement des scripts utilisateur
if not user_lib in sys.path:
sys.path.insert(0, user_lib) # Ajouter au chemin de recherche
import screen_io as ui # le module 'screen_io.py' module réside dans le répertoire user_lib
# Votre code suit ici
Cet exemple Python expose une variable XSCRIPTCONTEXT locale à un module importé :
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, sys
share_lib = Session.SharedPythonScripts() # Emplacement des scripts partagés
if not share_lib in sys.path:
sys.path.insert(0, share_lib) # Ajouter au chemin de recherche
from IDE_utils import ScriptContext # IDE_utils.py' se trouve avec les scripts Python partagés.
XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
# Votre code suit ici
Modules d'installation pour applications
Contrairement aux scripts personnels et partagĂ©s, les scripts d'installation de LibreOffice peuvent ĂȘtre importĂ©s Ă tout moment. Ă cĂŽtĂ© des modules LibreOffice Python uno & unohelper, les autres scripts prĂ©sents dans le rĂ©pertoire <installation_path>/program peuvent ĂȘtre importĂ©s directement, comme le module msgbox.
Avec le shell 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"))
Importation de modules de documents
Importing a Python document embedded module is illustrated below. Error handling is not detailed. Python run time path is updated when document has been opened and before closure. Refer to Event-Driven Macros to learn how to associate Python macros to document events.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys, uno
def OnDocPostOpenLoadPython():
""" Prepare Python modules import when doc. loaded """
PythonLibraries.loadLibrary('lib/subdir') # Add directory to search path
PythonLibraries.loadLibrary('my_gui', 'screen_io') # Add dir. & import screen_io
def OnDocQueryCloseUnloadPython():
""" Cleanup PYTHON_PATH when doc. Gets closed """
PythonLibraries.unloadLibrary('my_gui') # Python runtime path cleanup
# Note: imported modules remain loaded in this example..
class PythonLibraries():
""" Python library loader and module importer
adapted from 'BibliothĂšque de fonctions' by Hubert Lambert
at 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:
""" Check PYTHON_PATH content """
return (lib_name in sys.path)
def loadLibrary(lib_name: str, module_name=None):
""" add directory to PYTHON_PATH, import named 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):
""" remove directory from PYTHON_PATH """
sys.path.remove(lib_name)
g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)