Importar módulos Python

Os scritps Python do LibreOffice podem ser pessoais, partilhados ou embutidos em documentos. São armazenados nos vários locais descritos em Organização e locais dos scripts Python. Para importar módulos Python, a sua localização deve ser obtida do Python no tempo de execução.

Este mecanismo é ilustrado para módulos do sistema, e para módulos de documentos. O tratamento de exceções foi omitido para clareza. Os termos biblioteca ou diretório, scripts ou módulos são intercambiáveis. Uma macro Python refere-se a uma função dentro de um módulo.

warning

Note que o diretório local <Perfil do usuário>/Scripts/python/pythonpath é sempre percorrido ao executar uma macro Python a partir de <Perfil do usuário>/Scripts/python.


File System module import

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.

Módulos do utilizador ou partilhados

Personal & shared Python scripts can be imported once their directories are included in Python run time path. Refer to Getting session information page for more details regarding omitted Session Class.


        # -*- 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)  # Adicionar ao caminho de pesquisa
        import screen_io as ui  # o módulo 'screen_io.py' encontra-se na pasta user_lib
        # O seu código começa a partir daqui
    

Este exemplo Python expõe uma variável local, XSCRIPTCONTEXT, para um módulo importado:


        # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
        import uno, sys
            
        share_lib = Session.SharedPythonScripts()  # Localização dos scripts partilhados
        if not share_lib in sys.path:
            sys.path.insert(0, share_lib)  # Adicionar ao caminho de pesquisa
        from IDE_utils import ScriptContext  # 'IDE_utils.py' localiza-se com Python scripts partilhados.
        XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
        # O seu código começa a partir daqui
    

Módulos de instalação para aplicações

Ao contrário dos scripts pessoais e partilhados, os scripts instalados do LibreOffice podem ser importados a qualquer momento. Junto com os módulos uno e unohelper do LibreOffice, podem ser importados diretamente outros scripts presentes no diretório <caminho_instalação>/program, tal como o módulo msgbox.

Com a consola Python:

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

Importação de módulo de documentos

Importing a Python document embedded module is illustrated below. Error handling is not detailed. Python run time path is updated when document has been opened and before closure. Refer to Event-Driven Macros to learn how to associate Python macros to document events.


        # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
            
        import sys, uno
            
        def OnDocPostOpenLoadPython():
            """ Prepare Python modules import when doc. loaded """
            PythonLibraries.loadLibrary('lib/subdir')  # Adicionar diretório ao caminho de pesquisa
            PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Add dir. & import screen_io
            
        def OnDocQueryCloseUnloadPython():
            """ Limpar PYTHON_PATH quando doc. for fechado """
            PythonLibraries.unloadLibrary('my_gui')  # Python runtime path cleanup
            # Nota: os módulos importados permanecem carregados neste exemplo..
            
        class PythonLibraries():
            """ Carregador da biblioteca Python e importador de módulos
            
            adaptado de 'Bibliothèque de fonctions' de Hubert Lambert
            em https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
            def isImportedModule(module_name: str) -> bool:
                """ Verificar lista de módulos de tempo de execução """
                return (module_name in sys.modules.keys())
            def isLoadedLibrary(lib_name: str) -> bool:
                """ Verificar conteúdo de PYTHON_PATH """
                return (lib_name in sys.path)
            def loadLibrary(lib_name: str, module_name=None):
                """ adicionar o diretório ao PYTHON_PATH, importa o módulo nomeado """
                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):
                """ remover o diretório de PYTHON_PATH """
                sys.path.remove(lib_name)
            
        g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)