Obsah

# Import modulů Pythonu

Skripty Pythonu mohou být v LibreOffice trojího typu: osobní, sdílené nebo vložené v dokumentech. Jsou ukládány na různá místa popsaná v části Uspořádání a umístění skriptů Pythonu. Aby bylo možné moduly Pythonu importovat, musí být v době běhu jejich umístění známa.

V příkladu je toto znázorněno pro moduly ze souborového systému a pro moduly vložené v dokumentu. Pro přehlednost je vynecháno zpracování výjimek. Zaměnitelně jsou používány termíny knihovna nebo adresář a skripty nebo moduly. Termín makro Pythonu odkazuje na funkci v modulu.

Při spouštění makra Pythonu z umístění <uživatelský profil>/Scripts/python se vždy prochází lokální adresář <uživatelský profil>/Scripts/python/pythonpath.

## Import modulů ze souborového systému

Knihovny pro LibreOffice Basic obsahují třídy, podprogramy a proměnné, moduly Pythonu obsahují třídy, funkce a proměnné. Společné opětovně využitelné části pro Python nebo UNO je nutné uložit v kontejneru Moje makra v umístění (Uživatelský profil)/Scripts/python/pythonpath. Moduly jsou uspořádány do knihoven Pythonu, aby se zabránilo konfliktům mezi jejich názvy. Mezi sdílené moduly naimportujte uno.py.

### Uživatelské nebo sdílené moduly

Osobní a sdílené skripty lze importovat, pokud jsou jejich adresáře zahrnuty v cestě běhového prostředí Pythonu. Podrobnosti týkající se vynechané třídy Session naleznete na stránce Získávání informací o relaci.

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

            user_lib = Session().UserPythonScripts  # umístění uživatelských skriptů
            if not user_lib in sys.path:
                sys.path.insert(0, user_lib)  # Přidá k prohledávaným cestám
            import screen_io as ui  # modul 'screen_io.py' se nachází v adresáři user_lib
            # Následuje vlastní kód

V tomto příkladu v Pythonu je importovaný modul použit k vytvoření lokální proměnné XSCRIPTCONTEXT:

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

            share_lib = Session.SharedPythonScripts()  # umístění sdílených skriptů
            if not share_lib in sys.path:
                sys.path.insert(0, share_lib)  # Přidá k prohledávaným cestám
            from IDE_utils import ScriptContext  # 'IDE_utils.py' se nachází ve sdílených skriptech Pythonu
            XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
            # Následuje vlastní kód

### Nainstalované moduly

Na rozdíl od osobních a sdílených skriptů je možné skripty z instalace LibreOffice importovat kdykoliv a přímo. Kromě modulů Pythonu pro LibreOffice uno a unohelper se to týká i dalších skriptů, které se nacházejí v adresáři <cesta_k_instalaci>/program, například modulu msgbox.

Pomocí shellu Pythonu:

>>> 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 modulů v dokumentu

Následující příklad ilustruje import modulu Pythonu vloženého v dokumentu. Zpracování chyb je vynecháno. Cesta běhového prostředí Pythonu se aktualizuje ve chvíli, kdy se dokument otevře, a před tím, než se zavře. Návod, jak přiřadit makra Pythonu k událostem v dokumentu, naleznete v části Makra řízená událostmi.

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

            import sys, uno, zipimport

            def OnDocPostOpenLoadPython(event = None):
                """ Během načtení dokumentu připraví import modulů Pythonu """
                PythonLibraries.loadLibrary('lib/subdir')  # Přidá adresář k prohledávaným cestám
                PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Přidá adresář a naimportuje screen_io

            def OnDocQueryCloseUnloadPython(event = None):
                """ Během zavírání dokumentu vyčistí PYTHON_PATH """
                PythonLibraries.unloadLibrary('my_gui')  # Vyčistí cesty běhového prostředí Pythonu
                # Poznámka: v tomto příkladu zůstane importovaný modul načtený.

            class PythonLibraries():
                """ Knihovna Pythonu pro načítání a import modulů

                upraveno z příkladu "Bibliothèque de fonctions" od Huberta Lamberta
                na stránce https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
                def isImportedModule(module_name: str) -> bool:
                    """ Zkontroluje seznam modulů """
                    return (module_name in sys.modules.keys())
                def isLoadedLibrary(lib_name: str) -> bool:
                    """ Zkontroluje obsah 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):
                    """ přidá adresář do PYTHON_PATH, naimportuje modul podle názvu """
                    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):
                    """ odstraní adresář z PYTHON_PATH """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    sys.path.remove(url)

            g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)

Související témata

Získávání informací o relaci

Programování pomocí skriptů Pythonu

Uspořádání a umístění skriptů Pythonu

Příklady maker řízených událostmi naleznete v části Vytváření posluchačů událostí.

Podpořte nás!