Python: Importieren von Modulen

Inhalte

# 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.

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

Bibliotheken für LibreOffice Basic enthalten Klassen, Routinen und Variablen, Python-Module enthalten Klassen, Funktionen und Variablen. Allgemeine Teile wiederverwendbarer Python- oder UNO-Funktionen müssen in Meine Makros in (Anwenderprofil)/Scripts/python/pythonpath gespeichert werden. Bibliotheken für Python helfen beim Organisieren von Modulen, um Kollisionen von Modulnamen zu verhindern. Importieren Sie uno.py in gemeinsam genutzte Module.

### 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  # Speicherort der Benutzerskripte
            if not user_lib in sys.path:
                sys.path.insert(0, user_lib)  # Zum Suchpfad hinzufügen
            import screen_io as ui  # Das Modul 'screen_io.py' befindet sich im Verzeichnis user_lib
            # 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()  # Speicherort für gemeinsame Skripte
            if not share_lib in sys.path:
                sys.path.insert(0, share_lib)  # Zum Suchpfad hinzufügen
            from IDE_utils import ScriptContext # 'IDE_utils.py' enthält gemeinsam genutzte Python-Skripte.
            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, zipimport

            def OnDocPostOpenLoadPython(event = None):
                """ Bereitet den Import von Python-Modulen vor, wenn doc. geladen wird """
                PythonLibraries.loadLibrary('lib/subdir')  # Verzeichnis zum Suchpfad hinzufügen
                PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Fügt dir. & import screen_io hinzu

            def OnDocQueryCloseUnloadPython(event = None):
                """ Bereinigt PYTHON_PATH, wenn doc. geschlossen wird """
                PythonLibraries.unloadLibrary('my_gui') # Bereinigung des Python-Laufzeitpfads
                # Hinweis: In diesem Beispiel bleiben importierte Module geladen.

            class PythonLibraries():
                """ Python-Bibliotheks-Loader und Modul-Importer

                adaptiert aus 'Bibliothèque de fonctions' von Hubert Lambert
                unter https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
                def isImportedModule(module_name: str) -> bool:
                    """ Laufzeitmodulliste überprüfen """
                    return (module_name in sys.modules.keys())
                def isLoadedLibrary(lib_name: str) -> bool:
                    """ Überprüfung des PYTHON_PATH-Inhalts """
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    return (url in sys.path)
                def loadLibrary(lib_name: str, module_name=None):
                    """ Verzeichnis zu PYTHON_PATH hinzufügen, benanntes Modul importieren """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{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 """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    sys.path.remove(url)

            g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)

Verwandte Themen

Sitzungsinformationen abrufen

Programmierung mit Python-Skripten

Organisation und Speicherort von Python-Skripten

Beispiele für Ereignis-gesteuerte Makros finden Sie unter Erstellen eines Python-Listeners.