jueves, 23 de mayo de 2024

Python. Aplicación

Uso externo de script de Python para crear documentos

Después de exponer el esquema general, voy a continuar por explicar cómo entiendo el modo externo (1), y más concretamente la subdivisión que aprecio dentro de lo que en ese esquema identifiqué como modo 1A.


Dentro de éste considero necesario diferenciar entre lo que es crear un archivo de texto plano, que puedo identificar con extensión .txt, pero también como .doc, .odt o cualquier otra compatible con los procesadores de texto (Word y Writer, para ser más concretos), aunque siguen siendo archivos de texto plano (a esto llamo modo 1A1), de lo que supone crear archivo doc, xls o dpf en sentido estricto (modo 1A2).

El primero modo (1A1) es en realidad una forma de "engañar" a writer para que acceda directamente al archivo odt (también puede acceder a doc, como ya sabemos), para poder trabajar con él, aunque también puede hacerlo con un archivo txt sin mayor problema.

Mediante el segundo modo (1A2)  creamos archivos "originales" MSO o Acrobat, no archivos de texto plano, y tanto doc como xls son accesibles a LO-Writer/Calc, pero por la compatibilidad de LO, no por efecto de Python. Además, en este caso (1A2), para crearlos necesitamos trabajar en Python con paquetes (librerías) específicos (from... import) que previamente deberemos haber instalado (pip install).

Dejamos (de momento) 1A2 y nos centramos en la forma más simple (realmente muy simple) de crear documentos accesibles desde LO-Writer. Y digo bien, desde Writer, ya que este modo no es funcional para crear archivos compatibles con Calc (sí posible, pero no funcional).

Habrá que diferenciar dos momento o fases dentro de esto modo 1A1:

  • La fase (A) de creación del archivo (de momento, para más detalle, ver  las entradas de ARCHIVO en este mismo blog) mediante script Python
  • Y la base (B) de trabajo con el archivo desde LO-Writer.
En sentido estricto no podemos decir que estemos generando un docap, no al menos en la forma en que lo hemos creado hasta ahora mediante OOoBasic; pero no por ello deja de ser una forma sencilla de utilizar Python como alternativa a OOo Basic, aunque yo diría que más que alternativa, complementaria.

Complementaria porque también OOoBasic, bien como macro (funcionalidad Grabar macro), bien como script, resulta, no imprescindible pero sí conveniente para llegar a un resultado que podemos considerar equivalente a la automatización de documentos mediante OOo Basic (docap). Eso sí, con una limitación: debemos ceñirnos a trabajar con texto plano, sin elementos gráficos (vg. tablas), al que opcionalmente podemos dar formato desde LO-Writer con macros.

Y digo con macros porque me atrevo a ir un poco más allá en recomendaciones: en el momento actual de mis conocimientos planteo como más adecuado complementar el proceso con el uso de macros en vez de script; es mucho más sencillo e igual de funcional, por lo que nos será mucho más fácil crear este tipo de recursos.

Manteniendo este principio de funcionalidad y sencillez, en el momento actual, para los primeros desarrollo del modo 1A1 planteo usar la consola (símbolo del sistema en Windows) como recurso input. Esto nos ahorra la complejidad que implica la creación e implementación de una GUI (vg., basada en tkinter) y permite que nos centremos en la lógica de programación. Además el uso del cmd (consola) es perfectamente coherente con la simplicidad que buscamos y a la que debemos aspirar como profesionales ajenos a la programación profesional, aunque usuarios competentes de un lenguaje de programación que priorizan la funcionalidad frente al diseño. 

Este enfoque es similar al que observo en profesionales de otros campos (la medicina, el derecho, las ingenierías...) que también priorizan en el uso de Python (también de OOo Basic) la sencillez y la funcionalidad sobre el diseño. Creo que esto va en sentido lo contrario a lo que entiendo se busca desde determinados enfoques del desarrollo competencial docente: frente al consumidor de productos que supone la apuesta de la Administración por los lenguajes de autor, la  competencia que facilita el pensamiento computacional que promueve el aprendizaje y uso de un lenguaje de programación orientado al logro de objetivos profesionales relevantes.

Dado que lo creado hasta el momento es muy básico (no busco ahora utilidad alguna) será suficiente con que accedas al script Python, y a la macro de LO (1)

Y por si te interesa profundizar en el contenido, la forma y el funcionamiento, aquí tienes el vídeo que complementa esta entrada.



NOTA 1. En realidad se trata de un archivo .txt que deberás descargar y copiar en el IDE de LibreOffice, Mis_macros_y_diálogos.

Python. Aplicación

Python desde dentro de Libre Office

No hace mucho descubrí un vídeo en Youtu.Be en el que se explicaba que Excel había incorporado Python como lenguaje de macros. Creí que se trataba de un vídeo de una (¿nueva?) biblioteca que permitía generar documentos Excel desde Python, pero no: se trataba del uso de Python como lenguaje "interno" para crear funciones. Este video data del 30 de agosto de 2023 y hace referencia a una nueva funcionalidad de Excel, así que es novedad. ¡Qué cosas! LibreOffice dispone de esta misma funcionalidad, para todos sus servicios desde que tengo memoria de haberlo utilizado, y de eso ya van unos cuantos años...

No quiero decir con esto que la implementación de Python en Excel funcione exactamente igual que como funciona en LibreOffice, ya que, al parecer el objetivo es mucho más concreto y posiblemente el resultado sea también más funcional, pero resulta cuanto menos curioso que MSO-Excel "copie" una funcionalidad disponible en LibreOffice (genérico), disponiendo como se dispone de librerías específicas que permiten a Python trabajar con y para Excel (también para Word, como hemos identificado en el modo 1A2 en nuestro esquema. Algo tiende de específico y especial  este modo que en ese mismo esquema denominé Modo interno 2B.


Si por algo se caracteriza este modo es precisamente por su similitud con las formas de uso de OOo Basic, sin duda el lenguaje de "macros" preferente de LO (igual de lo es VBA para MSO), así que Python se presente como alternativa a VBA desde Excel viene a corroborar lo que Maurico Baeza ya planteó hace tiempo respecto a LO: la utilidad de Python para extender las funcionalidades de LO, derivada de la versatilidad y potencia del lenguaje.

Esto no implica que OOoBasic pase a ser obsoleto, ya que, hoy por hoy sigue presentando (a mi entender) varias ventajas respecto a Python, por lo que (opino (1)) es conveniente seguir aprendiendo y trabajando con OOo Basic en sus dos formas (2): a partir de Grabar macro y directamente desde el IDE creando script.
  • De facilidad de aprendizaje.
  • De facilidad de generación, incluyendo la funcionalidad Grabar macro, no disponible para Python.
  • Y la facilidad de aplicación o uso de las macros o script, que se concreta en una mayor capacidad de integración en los servicios LO.
Parece ser que la posibilidad de utilizar Python desde (dentro de ) LibreOffice no hay que darla por echa, siendo necesario comprobar que es posible mediante un sencillo procedimiento que consiste en lanzar una "macro" desde un documento Writer (yo hablaré de script) de comprobación (3):
  • Desde Herramientas/Macros/Ejecutar macro->
  • Selector de macros -> Biblioteca "Mis Macros" ->
  • Carpeta "HolaMundo-> script HelloWorldPython-> Ejecutar
Si se escribe en el documento el texto "Hello World (in Python) es que tienes Python disponible como lenguaje de "macros". En caso contrario deberás realizar los cambios pertinentes en la configuración de LibreOffice, pero si trabajas desde Windows es poco probable que no esté ya correctamente configurado.

Superada la primera dificultad  toca ahora afrontar la segunda: si estás acostumbrado a trabajar con OOoBasic te sorprenderán las dificultades para para gestionar los script Python, ya que sólo es posible ejecutar los que están disponibles desde Mis Macros o desde Macros de la aplicación, pero no parece posible crear y grabar script propios en ninguna de las tres ubicaciones conocidas (añadiendo a las dos anteriores el propio documento).

Existen modos de sortear estas dificultades (4), pero por el momento me voy a limitar a explicar una solución sencilla, aunque no ideal: sigue esta ruta para acceder y grabar los script de Python...

C:\Users\NombreUsuario\AppData\Roaming\LibreOffice\4\user\scripts\python (5)

... que estarán después accesibles desde Mis Macros. Este directorio es accesible desde Herramientas/Macros/Ejecutar macro o desde Herramientas/Macros/Organizar macros/Python, que son también las formas más simples de ejecutar un script.

Bien, ya sabemos cómo activar un script Python desde LO-Writer (por ejemplo) y cómo guardar los que creemos nosotros, pero aun  nos queda aprender a crearlos.

En efecto, sabemos que podemos crearlos desde el IDE de Python, y que podemos guardarlos en la ubicación que indica la dirección antes mostrada, incluso visualizarlos desde un documento (por ejemplo, desde Writer), pero no será reconocido sin más por LO como archivo válido si no cumple determinadas condiciones. Esto es lo que ocurre con el script que creamos para trabajar el modo 1A1...

print("¿Cómo te llamas?")
nombre=input()
print(f"Me alegro de conocerte,{nombre}")

... que podemos guardar y visualizar, pero al que no podemos acceder desde Writer -> (...) Ejecutar/Organizar macro.

Vamos a ver cuáles son esas condiciones que hacen posible el funcionamiento de un script Python llamado desde un servicio LO; y para ello nada mejor que explorar un ejemplo de script Python ubicado en ese subdirectorio, ya que sabemos que funciona, por ejemplo, mismamente HelloWorldPython.

Si abrimos este archivo desde Bloc de notas (por simplificar), obtenemos un documento cargado de líneas comentadas (#) que por el momento podemos obviar, así que el script, sin comentarios, queda como sigue:

def HelloWorldPython():

    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()

    if not hasattr(model, "Text"):
        model = desktop.loadComponentFromURL(
            "private:factory/swriter", "_blank", 0, ())

    text = model.Text
    tRange = text.End
    tRange.String = "Hello World (in Python)"
    return None

Por comprobar que todo funciona correctamente, podemos probar a guardar este archivo libre de comentarios con un nombre alternativo al original (HelloWorldBis.py) y comprobar sí funciona llamándolo desde Writer (Herramientas/Macros/Organizar macros/Python). Como es de esperar el resultado es positivo: se escribe en el documento la esperada frase Hello World (in Python).

Ya tenemos, pues, un script que no es reconocido y otro que sí y podemos ver que se diferencian en que en el segundo se utilizan instrucciones específicas, que sabemos forman parte de las propias de una librería especialmente diseñada en LO para hacer posible el uso de Python llamada PyUNO.
  • desktop.getCurrentComponent()
  • desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
Algunas de ellas no te resultarán extrañas, dada su similitud con las empleadas en OOoBasic. Otras son específicas de PyUNO:
  • XSCRIPTCONTEXT.getDesktop()
He ahí una cuestión importante: si podemos utilizar Python desde LO es porque desde Python empleamos una librería específica, imprescindible que poder hacerlo. Esto es similar a lo que hacemos desde el modo 1A2 para crear documentos word o excel, como señalo en otra entrada (6)

Para finalizar esta entrada, y aunque queda mucho por aclarar, paso a exponer el código de un script elaborado por mí a partir del código de los que se presentan como ejemplo. Incluye líneas de comentario (en rojo) para facilitar su comprensión.

def texto_en_python():
    #Imprime un texto en un documento Writer situando el cursor al final del mismo.
    saludador = "Javier"
    texto_saludo = f"Saludos cordiales de parte de {saludador}, desde Asturias.\n"
  texto_contenido = f"Este escrito realizado por {saludador} es parte de un proyecto de aprendizaje del uso de python en LO\n"
   texto_explica = f"En este caso se trata de generar información textual en soporte writer desde cualquier servicio de LO"
    texto = texto_saludo + texto_contenido + texto_explica
#Llamada a la aplicación de texto de Libre Office
    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()
#Entra en acción si la aplicación activa no es Writer
#En ese caso deriva a la creación de un nuevo documento writer
    if not hasattr(model, "Text"):
        model = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
    text = model.Text       #Llama a la subclase Text del componente actualmente activo
    tRange = text.End       #Ubica el puntero al final del documento
#Y escribe el contenido de la variable (podría escribir directamente un string)
    tRange.String = texto

Libre Office cuenta con otros ejemplos de código Python que son de interés para comprender las posibilidades del uso "interno" este lenguaje en la creación de script, así que en futuras entradas profundizaremos en la comprensión de estos ejemplo como paso previo para la creación de código propio. Pero por ahora es suficiente.

NOTA 1. Propongo que al menos hasta alcanzar un nivel de competencia asimilable al que podemos haber adquirido en OOoBasic, que se manifieste en ser capaces de generar soluciones basadas en Python similares a los docap creados mediante OOoBasic. Es un límite asequible y fácilmente comprobable, por lo que no supone una generalidad inconcreta.

NOTA 2Eso que en el esquema  se denomina modo interno 2A

NOTA 3. Creo que se explica en el vídeo de Mauricio Baeza que enlacé antes.

NOTA 4Incluyendo la instalación de extensiones que se pretenden simplificadoras de todas estas limitaciones (como la extensión APSO), pero son estos temas suficientemente complejos como para que lo más prudente en estos momentos iniciales los dejemos aparcados. Tiempo habrá de tratarlo más adelante.

NOTA 5Users puede aparecerte directamente como Usuarios y debes sustituir NombreUsuario por tu verdadero nombre de usuario. Además es posible que cuando llegues a este punto no encuentres visible la carpeta AppData (no confundir con la nombrada como Application Data); esto es debido a que está oculta. En ese caso vas al menú Vista y activas la casilla  Elementos ocultos. A partir de ahí puedes seguir la ruta indicada tanto para acceder a los script ya creados como para copiar los que tu crees, en principio desde el IDE que proporciona Python por defecto, desde el mismo bloc de notas o desde cualquier programa de edición de código (Thonny, por ejemplo, por empezar por uno sencillo).

NOTA 6. Ese modo de trabajo externo no ha sido explicado aun, dado que en este momento he priorizado la simplicidad a la secuencia de la categorización del esquema. Para mayor conocimiento de estos recursos acceder a la documentación de Foundation Wiki y la ayuda de LibreOffice y los enlaces a otros documentos que contienen estas dos referencias

miércoles, 22 de mayo de 2024

Python. Librerias

 Instalar paquetes mediante PIP

Se puede decir que cuando instalamos Python instalamos lo justo y necesario para empezar a trabajar, pero Python y su comunidad de usuarios dispone de un muy importante volumen de recursos, disponibles de formar gratuita y destinados a cubrir múltiples necesidades. Para acceder a ellos necesitamos instalarlos previamente. Para ello disponemos de diferentes medios, uno de ellos el instalador  PIP.

Como primera referencia te propongo este artículo de Bustamante S.J.(2021), publicado por freecodecamp.org en enero de 2021, que contiene la información necesaria para aprender a trabajar con el instalador pip.

También me ha parecido interesante y clarificador el vídeo de Errodringer del que además del enlace anterior, te dejo acceso directo a continuación. 



Creo que ambos contenidos son más que suficiente para el objetivo de esta entrada: saber en qué consiste la instalación de librerías y módulos, y cómo llevarla a cabo. Además me liberan de tener que hacer más extensa esta entrada.