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