Python: Import af moduler

Indhold

# Import af Pythonmoduler

LibreOffice Python-scripts kommer i markante varianter: de kan være personlige, delte eller indlejrede i dokumenter. De lagres på forskellige placeringer, der der beskrevet i Python Scripts Organization and Location (på engelsk). For at importere Python-moduler skal deres placering kendes fra Python på kørselstidspunktet.

Denne mekanisme vises for moduler baseret på filsystem og moduler baseret på et dokument. Håndtering af undtagelser er udeladt for klarhedens skyld. Udtrykkene bibliotek eller katalog, scripts eller moduler bruges i flæng. En Python-makro betegner en funktion i et modul.

Bemærk, at det lokale katalog <User Profile>/Scripts/python/pythonpath altid undersøges, når en Python-makro køres fra <User Profile>/Sripts/python.

## Import af filsystem-modul

LibreOffice Basic-biblioteker indeholder klasser, rutiner og variable; Python-moduler indeholder klasser, funktioner og variable. Almindelige stykker af genbrugelige Python eller UNO-funktioner skal lagres i Mine makroer i (User Profile)Scripts/python/pythonpath. Python-biblioteker hjælper til med at organisere modulerne for at udgå sammenfaldende modulnavne. Du skal importere uno.py i delte moduler.

### Bruger- eller delte moduler

Personlige og delte Python-scripts kan importeret, når deres kataloger indgår i Pythons kørselstidssti. Se flere enkeltheder om udeladt Sessionsklasse på siden Hentning af sessionsinformation.

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import sys

            user_lib = Session().UserPythonScripts  # Placering af bruger-scripts
            if not user_lib in sys.path:
                sys.path.insert(0, user_lib)  # Føj til søgesti
            import screen_io as ui  # 'screen_io.py' modulet findes i user_lib directory
            # Din kode følger her

Dette Python-eksempel udsætter en lokal XSCRIPTCONTEXT-variabel for et importeret modul:

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import uno, sys

            share_lib = Session.SharedPythonScripts()  # placering af delte scripts
            if not share_lib in sys.path:
                sys.path.insert(0, share_lib)  # Føj til søgesti
            from IDE_utils import ScriptContext  # 'IDE_utils.py' findes blandt de delte Python-scripts.
            XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
            # Din kode følger her

### Installationsmoduler til programmer

I modsætning til personlige og delte scripts, kan LibreOffice-installationsscripts importeres når som helst. Ligesom uno & unohelper LibreOffice Pythonmoduler, kan andre scripts der findes i kataloget <installation_path>/program importeres direkte, som for eksempel msgbox -modulet.

Med Python-skal:

>>> 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 af dokumentmodul

Import af et Python-modul, der er indlejret i et dokument, vises herunder. Der redegøres ikke for fejlhåndtering. Python kørselstidsstien opdateres, når dokumentet er åbnet og før lukning. Se Hændelsesdrevne makroer for at lære, hvordan du knytter Python-makroer til dokumenthændelser.

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals

            import sys, uno, zipimport

            def OnDocPostOpenLoadPython(event = None):
                """ Forbered import af Pythonmoduler, når doc. er indlæst """
                PythonLibraries.loadLibrary('lib/subdir')  # Tilføj katalog til søgesti
                PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Tilføj katalog & importér screen_io

            def OnDocQueryCloseUnloadPython(event = None):
                """ Rens PYTHON_PATH når doc. bliver lukket """
                PythonLibraries.unloadLibrary('my_gui')  # Rensning af Python afviklingssti
                # Bemærk: importerede moduler forbliver indlæst i dette eksempel.

            class PythonLibraries():
                """ Python-kataloglæser og modulimportør

                tilpasset efter 'Bibliothèque de fonctions' af Hubert Lambert
                på https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                def isImportedModule(module_name: str) -> bool:
                    """ Kontroller listen over kørselstidsmoduler """
                    return (module_name in sys.modules.keys())
                def isLoadedLibrary(lib_name: str) -> bool:
                    """ kontroller indholdet af PYTHON_PATH """
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    return (url in sys.path)
                def loadLibrary(lib_name: str, module_name=None):
                    """ tilføj katalog til PYTHON_PATH, importér navngivet modul """
                    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):
                    """ fjern katalog fra PYTHON_PATH """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    sys.path.remove(url)

            g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)

Relaterede emner

Hentning af sessionsinformation

Programmering med Python-scripts

Administration og placering af Python-scripts

Se Oprettelse af en Python Listener for eksempler på hændelses-drevne makroer.