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.

warning

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

LibreOffice Basic libraries contain classes, routines and variables, Python modules contain classes, functions and variables. Common pieces of reusable Python or UNO features must be stored in My macros within (User Profile)/Scripts/python/pythonpath. Python libraries help organize modules in order to prevent module name collisions. Import uno.py inside shared modules.

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
            
        user_lib = Session().UserPythonScripts  # User scripts location
        if not user_lib in sys.path:
            sys.path.insert(0, user_lib)  # Add to search path
        import screen_io as ui  # 'screen_io.py' module resides in user_lib directory
        # Uw code volgt hier
    

This Python example exposes a local XSCRIPTCONTEXT variable to an imported module:


        # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
        import uno, sys
            
        share_lib = Session.SharedPythonScripts()  # Shared scripts location
        if not share_lib in sys.path:
            sys.path.insert(0, share_lib)  # Add to search path
        from IDE_utils import ScriptContext  # 'IDE_utils.py' sits with shared Python scripts.
        XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
        # Uw code volgt hier
    

Modules voor toepassingen installeren

Unlike personal and shared scripts, LibreOffice installation scripts can be imported any time. Next to uno & unohelper LibreOffice Python modules, other scripts present in <installation_path>/program directory can be imported directly, such as the msgbox module.

With 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 Import

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

Help ons, alstublieft!