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.

warning

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
            
        def OnDocPostOpenLoadPython():
            """ 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():
            """ Rens PYTHON_PATH når doc. bliver lukket """
            PythonLibraries.unloadLibrary('my_gui')  # Rensning af Python kørselstidssti
            # 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 """
                return (lib_name 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(
                    '{}/{}'.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):
                """ fjern katalog fra PYTHON_PATH """
                sys.path.remove(lib_name)
            
        g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)
    

Støt os venligst!