Python: Modules importeren

Inhoud
Index 🔎︎

# 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

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)  # 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' sits with shared 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.

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 importeren

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:
                    """ Controleer inhoud PYTHON_PATH """
                    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)

Verwante onderwerpen

Getting Session Information

Programmeren met Python-scripts

Python Scripts Organization and Location

Refer to Creating a Python Listener for examples of event-driven macros.