Importieren von Python-Modulen

LibreOffice Python-Skripte gibt es in drei verschiedenen Varianten. Sie können persönlich sein, gemeinsam genutzt werden oder in Dokumente eingebettet sein. Sie werden an verschiedenen Orten gespeichert, die in Organisation und Speicherort von Python-Skripten beschrieben sind. Um Python-Module zu importieren, müssen ihre Positionen zur Laufzeit von Python bekannt sein.

Dieser Mechanismus ist für Dateisystem- und Dokument-basierte Module dargestellt. Die Ausnahmebehandlung ist aus Gründen der Übersichtlichkeit weggelassen. Die Begriffe Bibliothek oder Verzeichnis, Skripte oder Module werden synonym verwendet. Ein Python-Makro verweist auf eine Funktion in einem Modul.

warning

Beachten Sie, dass das lokale Verzeichnis <User Profile>/Scripts/python/pythonpath immer durchsucht wird, wenn ein Python-Makro unter <User Profile>/Scripts/python ausgeführt wird.


Import von Dateisystemmodulen

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.

Persönliche oder gemeinsam genutzte Module

Persönliche und gemeinsam genutzte Python-Skripte können importiert werden, sobald ihre Verzeichnisse im Python-Laufzeitpfad enthalten sind. Weitere Informationen zu ausgelassenen Sitzungsklassen finden Sie auf der Seite Sitzungsinformationen abrufen.


        # -*- 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
        # Ihr Code folgt hier
    

In diesem Python-Beispiel wird eine lokale Variable XSCRIPTCONTEXT für ein importiertes Modul verfügbar gemacht:


        # -*- 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)
        # Ihr Code folgt hier
    

Installationsmodule für Anwendungen

Im Gegensatz zu persönlichen und freigegebenen Skripten können vorinstallierte LibreOffice-Skripte jederzeit importiert werden. Neben den LibreOffice Python-Modulen uno und unohelper können andere Skripte, die im Verzeichnis <Installationspfad>/program vorhanden sind, direkt importiert werden, beispielsweise das Modul msgbox.

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

Import von Dokumentenmodulen

Das Importieren eines in Python-Dokumente eingebetteten Moduls ist unten dargestellt. Fehlerbehandlung ist nicht detailliert. Der Python-Laufzeitpfad wird aktualisiert, wenn das Dokument geöffnet wurde und bevor es geschlossen wird. Informationen zum Zuordnen von Python-Makros zu Dokumentereignissen finden Sie unter Ereignisgesteuerte Makros.


        # -*- 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
            
            adaptiert aus 'Bibliothèque de fonctions' von 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):
                """ Verzeichnis aus PYTHON_PATH entfernen """
                sys.path.remove(lib_name)
            
        g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)
    

Bitte unterstützen Sie uns!