¡Hola desarrolladores! Comparto con vosotros una [plantilla de Python Embebido](https://openexchange.intersystems.com/package/iris-embedded-python-template) básica, que recomiendo como punto de partida para cualquier proyecto general con InterSystems IRIS que use Python Embebido. Funcionalidades: * Python Embebido configurado; * 3 ejemplos con difentes formas de desarrollar con Python Embebido; * VSCode configurado; * Docker disponible; * Demo online disponible; * Desarrollo ZPM First disponible. Vamos a comentar estas funcionalidades. Primero vamos a hablar de Python Embebido. Esta funcionalidad viene con InterSystems IRIS 2021.2 y permite desarrollar soluciones usando InterSystems IRIS con Python. IRIS 2021.2 y posteriores permiten la ejecución de _scripts_ de Python en un entorno de memoria compartida con InterSystems IRIS que ofrece opciones únicas a los desarrolladores Python al usar la bases de datos en la que el código está cerca de los datos.  ### 3 formas de desarrollar con Python Embebido ### **Invocación a librerías de Python desde ObjectScript** Esto es posible por la clase [%SYS.Python](https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=%25SYS.Python), que permite importar librerías de python y llamar a Python a través de ObjectScirpt. [Documentación](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_callpython_library), [Ejemplo](https://github.com/intersystems-community/iris-embedded-python-template/blob/be578226b7a0c583df1f7b693b1bdae074efb1bd/src/dc/python/PersistentClass.cls#L17). Aquí podéis ver un ejemplo de código:
<span class="hljs-keyword">ClassMethod</span> Today() <span class="hljs-keyword">As</span> <span class="hljs-built_in">%Status</span>
{
  <span class="hljs-keyword">Set</span> sc = <span class="hljs-built_in">$$$OK</span>
  <span class="hljs-keyword">Set</span> dt = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"datetime"</span>)
  <span class="hljs-keyword">write</span> dt.date.today().isoformat()
  <span class="hljs-keyword">Return</span> sc
}
### Escribir métodos de clase de ObjectScript en Python De hecho, ahora los desarrolladores pueden usar la etiqueta [Language=python] en la declaración del método y codificar en Python puro. Hay también una librería de ayuda en Python "iris"  que se puede utilizar para hacer referencia a las clases y _globals_ de ObjectScript. [Documentación](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_runpython_method), [Ejemplo](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/src/dc/python/PersistentClass.cls#L17), código de muestra:
ClassMethod CreateRecordPython(propValue As %VarString, ByRef id As %Integer) [ Language = python ]
{
    <span class="hljs-keyword">import</span> iris
    obj=iris.cls(__name__)._New()
    obj.Test=propValue
    sc=obj._Save()
    id=obj._Id()
    <span class="hljs-keyword">return</span> sc
}
### Codificar las soluciones de InterSystems IRIS en Python puro Esta es la tercera opción para que los desarrolladores puedan trabajar con IRIS. Aquí el _script_ de Python necesita ser conectado a IRIS, y esto se puede hacer a través de variables de entorno y el servicio CallIn configurado a "On". Podéis ver los detalles más abajo. Una vez configurado el script de Python es ejecutado en la memoria compartida junto con IRIS. Aquí la librería "iris" es muy útil también. [Documentación](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_runpython_script), [Ejemplo](https://github.com/intersystems-community/iris-embedded-python-template/blob/master/python/irisapp.py). 
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create_rec</span><span class="hljs-params">(var)</span>:</span>
    obj=iris.cls(<span class="hljs-string">'dc.python.PersistentClass'</span>)._New()
    obj.Test=var
    obj._Save()
    id=obj._Id()
    <span class="hljs-keyword">return</span> id

<span class="hljs-comment"># test record creation</span>
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
now=str(datetime.now())
print(<span class="hljs-string">"Creating new record in dc.python.PersistentClass"</span>)
print(create_rec(now))

<span class="hljs-comment">## run SQL and print data</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run_sql</span><span class="hljs-params">(query)</span>:</span>
    rs=iris.sql.exec(query)
    <span class="hljs-keyword">for</span> idx, row <span class="hljs-keyword">in</span> enumerate(rs):
        print(<span class="hljs-string">f"[<span class="hljs-subst">{idx}</span>]: <span class="hljs-subst">{row}</span>"</span>)

query=<span class="hljs-string">"Select * from dc_python.PersistentClass"</span>
print(<span class="hljs-string">"Running SQL query "</span>+query)
run_sql(query)
### Docker configurado El repositorio de la plantilla ejecuta IRIS en un contenedor y configura todo lo necesario para trastear con Python Embebido.  Variables de entorno. Python Embebido necesita configurar ciertas variables de entorno para conectarse a IRIS y ejecutar los _scripts_ de Python. Esta es la configuración que lo posibilita en [dockerfile](https://github.com/intersystems-community/iris-embedded-python-template/blob/be578226b7a0c583df1f7b693b1bdae074efb1bd/Dockerfile#L13-L17):
# init Python env
ENV PYTHON_PATH=/usr/irissys/bin/irispython
ENV SRC_PATH=/irisrun/repo
ENV IRISUSERNAME "SuperUser"
ENV IRISPASSWORD "SYS"
ENV IRISNAMESPACE "USER"
También, Python Embebido necesita el servicio CallIn "on". Esto se configura en el [iris.script](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/iris.script#L7) durante la fase del build del docker:
<span class="hljs-comment">; enabling callin for Embedded Python</span>
    <span class="hljs-keyword">do</span> <span class="hljs-keyword">##class</span>(Security.Services).Get(<span class="hljs-string">"%Service_CallIn"</span>,.prop)
    <span class="hljs-keyword">set</span> prop(<span class="hljs-string">"Enabled"</span>)=<span class="hljs-number">1</span>
    <span class="hljs-keyword">set</span> prop(<span class="hljs-string">"AutheEnabled"</span>)=<span class="hljs-number">48</span>
    <span class="hljs-keyword">do</span> <span class="hljs-keyword">##class</span>(Security.Services).Modify(<span class="hljs-string">"%Service_CallIn"</span>,.prop)
Además, tu solución puede necesitar algunas librerías de Python a mayores. Esto es proporcionado mediante el archivo [requirements.txt](https://github.com/intersystems-community/iris-embedded-python-template/blob/master/requirements.txt) en la raíz del repositorio y una llamada pip3 en el [dockerfile](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/Dockerfile#L22):
pip3 install -r requirements.txt && \
### VSCode configurado Es muy recomendable desarrollar en VSCode usando docker. Si quieres desarrollar IRIS con Python Embebido en Docker, VSCode necesita ser configurado a [modo Devcontainer](https://code.visualstudio.com/docs/remote/containers). Para ello, introduce el archivo [devcontainer.json file](https://github.com/intersystems-community/iris-embedded-python-template/blob/master/.devcontainer/devcontainer.json) en la carpeta .devcontainer folder. Describe qué servicio docker necesita para trabajar con (iris en nuestro caso) y esto ayuda a ejecutar los _scripts_ de Python en VSCode que serán servidos por el motor de Python utilizado por IRIS que se está ejecutando en el contenedor. El archivo devcontainer.json también tiene una sección con una descripción de qué [extensiones](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/.devcontainer/devcontainer.json#L43) son necesarias en modo contenedor:
"extensions": [
        "ms-python.python",
        "ms-python.vscode-pylance",
        "intersystems-community.vscode-objectscript",
        "intersystems.language-server",
        "intersystems-community.servermanager",
        "ms-vscode.docker"
    ],
### Instalar Python Embebido con ZPM Esta plantilla está configurada como un repositorio de desarrollo "ZPM first". Esto significa que todo el código desarrollado está descrito en module.xml y es instalado como un módulo ZPM cada vez que la imagen del docker es desplegada por el desarrollador mediante la siguiente líne de código en iris.script:
zpm "load /home/irisowner/irisbuild/ -v":1:1
Y el código de Python Embebido también está descrito en el módulo ZPM - siendo instalado a través de [FILECOPY](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/module.xml#L11):
<FileCopy Name="python/" Target="${libdir}python/"/>
Con esta expresión indicamos que queremos empaquetar todos los _scripts_ de Python bajo la carpeta /python en el repositorio e instalarla en la carpeta python/ en un directorio de librerías de la instalación IRIS de destino. Si los _scripts_ de Python son copiados bajo la carpeta ${libdir}python/, estarán disponibles para ser invocadas desde ObjectScript o desde Python en la máquina IRIS de destino. _**¡Ojo! Asegúrate de que los nombres de tus carpeta tienen nombres únicos para los scripts de Python para no invalidar otro código Python accidentalmente.**_ Espero que esta plantilla os resulte útil. Comentarios y especialmente _pull requests_ son bienvenidos :D