Importar módulos Python

Os scritps Python do Collabora Office 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 utilizador>/Scripts/python/pythonpath é sempre percorrido ao executar uma macro Python a partir de <Perfil do utilizador>/Scripts/python.


Importar módulos do sistema de arquivos

Collabora Office 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

Os scripts Python - pessoais e partilhados - podem ser importados assim que as suas pastas forem incluídas no caminho de execução do Python. Consulte Obtendo informação da sessão para mais informações referentes à Classe Session omitida.

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

user_lib = Session().UserPythonScripts  # Localização dos scripts de utilizador
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 Collabora Office podem ser importados a qualquer momento. Junto com os módulos uno e unohelper do Collabora Office, 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

Mostra-se abaixo como importar um documento com um módulo Python embutido. O tratamento de erros não é considerado. O caminho em tempo de execução do Python é atualizado quando o documento é aberto, e antes do seu encerramento. Consulte Macros acionadas por eventos para saber como associar macros Python a eventos de documento.

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

import sys, uno

def OnDocPostOpenLoadPython():
    """ Preparar importação de módulos Python quando o doc. for carregado """
    PythonLibraries.loadLibrary('lib/subdir')  # Adicionar diretório ao caminho de pesquisa
    PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Adicionar dir. e importar screen_io

def OnDocQueryCloseUnloadPython():
    """ Limpar PYTHON_PATH quando doc. for fechado """
    PythonLibraries.unloadLibrary('my_gui')  # Limpeza do caminho de execução do Python
    # Note: imported modules remain loaded in this example.

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)

Necessitamos da sua ajuda!