{"id":41221,"date":"2020-02-06T20:42:46","date_gmt":"2020-02-06T17:42:46","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/python-gateway-v-intersystems-iris"},"modified":"2020-02-06T20:42:46","modified_gmt":"2020-02-06T17:42:46","slug":"python-gateway-v-intersystems-iris","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway en InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Este art\u00edculo est\u00e1 dedicado a Python Gateway, un proyecto comunitario de c\u00f3digo abierto para la plataforma de datos InterSystems IRIS. Este proyecto permite orquestar cualquier algoritmo de aprendizaje autom\u00e1tico creado en Python (el entorno principal para muchos cient\u00edficos de datos), utilizando numerosas bibliotecas listas para crear r\u00e1pidamente soluciones anal\u00edticas adaptativas y automatizadas de IA\/ML en la plataforma InterSystems IRIS. En este art\u00edculo, mostrar\u00e9 c\u00f3mo InterSystems IRIS puede orquestar procesos en Python, realizar de manera efectiva la transferencia bidireccional de datos y crear procesos de negocio inteligentes.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"plan\">Plan<\/h1>\n<p><\/p>\n<ol>\n<li>Introducci\u00f3n.<\/li>\n<li>Herramientas.<\/li>\n<li>Instalaci\u00f3n.<\/li>\n<li>API.<\/li>\n<li>Interoperabilidad.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Conclusiones.<\/li>\n<li>Enlaces.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introducci\u00f3n<\/h1>\n<p><\/p>\n<p>Python es un lenguaje de programaci\u00f3n de alto nivel de prop\u00f3sito general, orientado a mejorar la productividad del desarrollador y la legibilidad del c\u00f3digo. En esta serie de art\u00edculos, hablar\u00e9 sobre las posibilidades de aplicar Python en la plataforma InterSystems IRIS, centr\u00e1ndome en su uso como lenguaje para crear y aplicar modelos de aprendizaje autom\u00e1tico.<\/p>\n<p><\/p>\n<p>El aprendizaje autom\u00e1tico (ML) es una clase de m\u00e9todos de inteligencia artificial que se caracterizan por no resolver directamente el problema, sino aprender durante la resoluci\u00f3n de m\u00faltiples problemas similares. <\/p>\n<p><\/p>\n<p>Los algoritmos y modelos de aprendizaje autom\u00e1tico est\u00e1n cada vez m\u00e1s presentes. Hay muchas razones para ello, pero todo se reduce a la accesibilidad, simplicidad y logro de resultados pr\u00e1cticos. \u00bfEs la clustering o incluso la modelizaci\u00f3n de redes neuronales una nueva tecnolog\u00eda? <\/p>\n<p><\/p>\n<p>Por supuesto que no, pero actualmente no es necesario escribir cientos de miles de l\u00edneas de c\u00f3digo para ejecutar un modelo, y los costos de creaci\u00f3n y aplicaci\u00f3n de modelos est\u00e1n disminuyendo cada vez m\u00e1s.<\/p>\n<p><\/p>\n<p>Las herramientas est\u00e1n evolucionando; aunque no tenemos herramientas de IA\/ML totalmente orientadas a GUI, el progreso que hemos visto con muchas otras clases de sistemas de informaci\u00f3n, como BI (desde la codificaci\u00f3n hasta el uso de marcos y soluciones configurables orientadas a GUI), tambi\u00e9n se est\u00e1 observando en las herramientas para crear IA\/ML. Ya hemos superado la etapa de codificaci\u00f3n y hoy en d\u00eda utilizamos marcos para construir y entrenar modelos.<\/p>\n<p><\/p>\n<p>Otras mejoras, como la capacidad de difundir un modelo preentrenado, donde el usuario final solo tiene que completar el entrenamiento del modelo con sus datos espec\u00edficos, tambi\u00e9n facilitan el inicio en la aplicaci\u00f3n del aprendizaje autom\u00e1tico. Estos avances simplifican significativamente el aprendizaje del aprendizaje autom\u00e1tico tanto para especialistas como para empresas en general.<\/p>\n<p><\/p>\n<p>Por otro lado, estamos recopilando cada vez m\u00e1s datos. Gracias a una plataforma de datos unificada, como InterSystems IRIS, toda esta informaci\u00f3n puede ser preparada y utilizada de inmediato como datos de entrada para modelos de aprendizaje autom\u00e1tico.<\/p>\n<p><\/p>\n<p>Con la transici\u00f3n a la nube, lanzar proyectos de IA\/ML se vuelve m\u00e1s f\u00e1cil que nunca. Solo podemos consumir los recursos que necesitamos. Adem\u00e1s, gracias a la paralelizaci\u00f3n que ofrecen las plataformas en la nube, podemos ahorrar tiempo.<\/p>\n<p><\/p>\n<p>\u00bfPero qu\u00e9 pasa con los resultados? Aqu\u00ed es donde las cosas se complican. Existen m\u00faltiples herramientas para construir modelos, de las cuales hablar\u00e9 a continuaci\u00f3n. Construir un buen modelo no es f\u00e1cil, \u00bfpero qu\u00e9 sigue? Obtener beneficios de un modelo que utiliza el negocio tambi\u00e9n es una tarea no trivial. La ra\u00edz del problema radica en la separaci\u00f3n de las cargas anal\u00edticas y transaccionales, as\u00ed como de los modelos de datos. Cuando entrenamos un modelo, generalmente lo hacemos con datos hist\u00f3ricos. Pero el lugar para el modelo construido es en el procesamiento transaccional de datos. \u00bfDe qu\u00e9 sirve el mejor modelo de detecci\u00f3n de transacciones fraudulentas si lo ejecutamos una vez al d\u00eda? Los estafadores ya se han ido con el dinero. Necesitamos entrenar el modelo con datos hist\u00f3ricos, pero tambi\u00e9n debemos aplicarlo en tiempo real a los nuevos datos entrantes para que nuestros procesos comerciales puedan actuar de acuerdo con las predicciones realizadas por el modelo.<\/p>\n<p><\/p>\n<p>ML Toolkit es un conjunto de herramientas cuyo objetivo es precisamente esto: combinar modelos y entornos transaccionales, para que los modelos construidos puedan ser f\u00e1cilmente utilizados directamente en sus procesos comerciales. Python Gateway es parte de ML Toolkit y permite la integraci\u00f3n con el lenguaje Python (de manera similar a como R Gateway, que forma parte de ML Toolkit, proporciona integraci\u00f3n con el lenguaje R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Herramientas<\/h1>\n<p><\/p>\n<p>Antes de continuar, me gustar\u00eda describir algunas herramientas y bibliotecas de Python que utilizaremos m\u00e1s adelante.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Tecnolog\u00edas<\/h2>\n<p><\/p>\n<ul>\n<li>Python es un lenguaje de programaci\u00f3n interpretado, de alto nivel y de prop\u00f3sito general. La principal ventaja del lenguaje es su gran biblioteca de bibliotecas matem\u00e1ticas, de aprendizaje autom\u00e1tico (ML) y de inteligencia artificial (AI). Al igual que ObjectScript, es un lenguaje orientado a objetos, pero todo se define din\u00e1micamente, no est\u00e1ticamente. Adem\u00e1s, todo es un objeto. Los art\u00edculos posteriores suponen un conocimiento pasajero del lenguaje. Si deseas comenzar a aprender, te recomiendo empezar con <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">la documentaci\u00f3n<\/a><\/noindex>.<\/li>\n<li>Para nuestros ejercicios posteriores, instala <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 de 64 bits<\/a><\/noindex>.<\/li>\n<li>IDE: Yo uso <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, pero en general hay otros. <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">muchas<\/a><\/noindex>. Si utilizas Atelier, hay un complemento de Eclipse para desarrolladores de Python. Si usas VS Code, hay una extensi\u00f3n para Python. <\/li>\n<li>Notebook: en lugar de un IDE, puedes escribir y compartir tus scripts en cuadernos en l\u00ednea. El m\u00e1s popular de ellos es <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Bibliotecas<\/h2>\n<p><\/p>\n<p>Aqu\u00ed hay una lista (no exhaustiva) de bibliotecas para aprendizaje autom\u00e1tico:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 paquete fundamental para c\u00e1lculos precisos.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 estructuras de datos de alto rendimiento y herramientas de an\u00e1lisis de datos.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 creaci\u00f3n de gr\u00e1ficos.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 visualizaci\u00f3n de datos basada en matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 m\u00e9todos de aprendizaje autom\u00e1tico.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 algoritmos de aprendizaje autom\u00e1tico dentro de la metodolog\u00eda de refuerzo de gradiente (Gradient Boosting).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/radimrehurek.com\/gensim\/\">Gensim<\/a><\/noindex> \u2014 procesamiento de lenguaje natural (NLP).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/keras.io\/\">Keras<\/a><\/noindex> \u2014 redes neuronales.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 plataforma para construir modelos de aprendizaje autom\u00e1tico.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 plataforma para construir modelos de aprendizaje autom\u00e1tico orientada a Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML de varios modelos.<\/li>\n<\/ul>\n<p><\/p>\n<p>Las tecnolog\u00edas AI\/ML permiten que las empresas sean m\u00e1s eficientes y adaptables. Adem\u00e1s, hoy en d\u00eda estas tecnolog\u00edas se est\u00e1n volviendo m\u00e1s f\u00e1ciles de desarrollar e implementar. Comienza a estudiar las tecnolog\u00edas AI\/ML y c\u00f3mo pueden ayudar a tu organizaci\u00f3n a crecer.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Instalaci\u00f3n<\/h1>\n<p><\/p>\n<p>Hay varias maneras de instalar y usar Python Gateway:<\/p>\n<p><\/p>\n<ul>\n<li>el sistema operativo\n<ul>\n<li>Windows<\/li>\n<li>Linux<\/li>\n<li>Mac<\/li>\n<\/ul>\n<\/li>\n<li>Docker\n<ul>\n<li>Usa una imagen de DockerHub<\/li>\n<li>Crea tu propia imagen<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Independientemente de la forma de instalaci\u00f3n, necesitar\u00e1s el c\u00f3digo fuente. El \u00fanico lugar para descargar el c\u00f3digo es <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">la p\u00e1gina de lanzamientos<\/a><\/noindex>. Contiene lanzamientos estables probados, simplemente toma el \u00faltimo. En este momento es 0.8, pero con el tiempo habr\u00e1 nuevos. No clones\/subas el repositorio, descarga la \u00faltima versi\u00f3n.<\/p>\n<p><\/p>\n<h2 id=\"os\">el sistema operativo<\/h2>\n<p><\/p>\n<p>Si est\u00e1 instalando el Gateway de Python en un sistema operativo, primero (independientemente del sistema operativo) debe instalar Python. Para ello:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Instale Python 3.6.7 de 64 bits<\/a><\/noindex>. Se recomienda instalar Python en el directorio predeterminado.<\/li>\n<li>Instale el m\u00f3dulo <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Descargue el c\u00f3digo ObjectScript (es decir, <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\" ,,1)<\/code>) en cualquier espacio de nombres con productos. Si desea que un espacio existente admita productos, ejecute: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Coloque <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> a la carpeta <code>bin<\/code> de su instancia InterSystems IRIS. El archivo de la biblioteca debe ser accesible en la ruta devuelta por <code>write ##class(isc.py.Callout).GetLib()<\/code>. <\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"windows\">Windows<\/h3>\n<p><\/p>\n<ol>\n<li>Aseg\u00farese de que la variable de entorno <code>PYTHONHOME<\/code> apunte a Python 3.6.7.<\/li>\n<li>Aseg\u00farese de que la variable de entorno del sistema <code>PATH<\/code> contenga la variable <code>PYTHONHOME<\/code> (o el directorio al que apunta).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Verifique que la variable de entorno <code>PATH<\/code> contiene <code>\/usr\/lib<\/code> y <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Utilice el archivo <code>\/etc\/environment<\/code> para establecer las variables de entorno.<\/li>\n<li>Si hay errores <code>s\u00edmbolo indefinido: _Py_TrueStruct<\/code> configure la opci\u00f3n <code>PythonLib<\/code>. Tambi\u00e9n en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> hay una secci\u00f3n de resoluci\u00f3n de problemas.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Actualmente solo se admite Python 3.6.7 de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Verifique la variable <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Si ha cambiado las variables de entorno, reinicie su producto InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>El uso de contenedores ofrece varias ventajas: <\/p>\n<p><\/p>\n<ul>\n<li>Portabilidad<\/li>\n<li>Eficiencia<\/li>\n<li>\u26a0\ufe0f Limitado<\/li>\n<li>Ligereza<\/li>\n<li>Inmutabilidad<\/li>\n<\/ul>\n<p><\/p>\n<p>Consulte esta <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">serie de art\u00edculos<\/a><\/noindex> para obtener m\u00e1s informaci\u00f3n sobre el uso de Docker con los productos de InterSystems. <\/p>\n<p><\/p>\n<p>Todas las compilaciones del Gateway de Python actualmente se basan en contenedores <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Imagen lista<\/h3>\n<p><\/p>\n<p>Ejecuta: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, para descargar y ejecutar el Gateway de Python con la Edici\u00f3n de Comunidad de InterSystems IRIS. Eso es todo.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Crea tu propia imagen<\/h3>\n<p><\/p>\n<p>Para construir la imagen de Docker, ejecute en la ra\u00edz del repositorio: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nPor defecto, la imagen se construye sobre la imagen <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, sin embargo, puede cambiar esto configurando la variable <code>IMAGE<\/code>.<br \/>\nPara compilar desde InterSystems IRIS, ejecute: `docker build --build-arg IMAGE=store\/intersystems\/iris:2019.4.0.383.0 --force-rm --tag intersystemscommunity\/irispy:latest &lt;&lt;.<\/p>\n<p><\/p>\n<p>Despu\u00e9s de eso, puede ejecutar la imagen de Docker:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">docker run -d \n  -p 52773:52773 \n  -v \/\/:\/mount \n  --name irispy \n  intersystemscommunity\/irispy:latest \n  --key \/mount\/iris.key<\/code><\/pre>\n<p><\/p>\n<p>Si utiliza una imagen basada en la Edici\u00f3n de Comunidad de InterSystems IRIS, puede omitir la clave.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Comentarios<\/h3>\n<p><\/p>\n<ul>\n<li>Proceso de prueba <code>isc.py.test.Process<\/code> almacena una serie de im\u00e1genes en un directorio temporal. Es posible que desee cambiar esta ruta a un directorio montado. Para ello, edite la configuraci\u00f3n <code>WorkingDir<\/code> especificando el directorio montado.<\/li>\n<li>Para acceder al terminal, ejecute: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Acceso al Portal de Gesti\u00f3n del Sistema con el inicio de sesi\u00f3n <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Para detener el contenedor, ejecute: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Comprobaci\u00f3n de la instalaci\u00f3n<\/h2>\n<p><\/p>\n<p>Despu\u00e9s de haber instalado el Python Gateway, debe verificar que funciona. Ejecute este c\u00f3digo en el terminal de InterSystems IRIS:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Callout).Setup() \nset sc = ##class(isc.py.Main).SimpleString(\"x='HELLO'\", \"x\", , .var).\nwrite var<\/code><\/pre>\n<p><\/p>\n<p>Como resultado, debe imprimirse <code>HELLO<\/code> \u2014 el valor de la variable de Python <code>x<\/code>. Si el estado devuelto <code>sc<\/code> es un error o <code>var<\/code> est\u00e1 vac\u00edo, verifique <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 secci\u00f3n de soluci\u00f3n de problemas<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway est\u00e1 instalado y se ha asegurado de que funcione. \u00a1Es hora de comenzar a usarlo!<br \/>\nLa interfaz principal para Python es <code>isc.py.Main<\/code>. Ofrece los siguientes grupos de m\u00e9todos (todos devuelven <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Ejecuci\u00f3n de c\u00f3digo<\/li>\n<li>Transmisi\u00f3n de datos<\/li>\n<li>Auxiliares<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Ejecuci\u00f3n de c\u00f3digo<\/h2>\n<p><\/p>\n<p>Estos m\u00e9todos permiten ejecutar c\u00f3digo Python arbitrario.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 es el m\u00e9todo principal. Acepta 4 argumentos opcionales:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 cadena de c\u00f3digo a ejecutar. El car\u00e1cter de nueva l\u00ednea: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 nombre de la variable para devolver.<\/li>\n<li><code>serialization<\/code> \u2014 c\u00f3mo serializar <code>returnVariable<\/code>. 0 \u2014 string (predeterminado), 1 \u2014 repr.<\/li>\n<li><code>resultado<\/code> \u2014 ByRef referencia a la variable donde se escribe el valor <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Anteriormente, hemos ejecutado:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).SimpleString(\"x='HELLO'\", \"x\", , .var).<\/code><\/pre>\n<p><\/p>\n<p>En este ejemplo, asignamos a una variable de Python <code>x<\/code> valor <code>Hola<\/code> y queremos devolver el valor de la variable de Python <code>x<\/code> a una variable de ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode es una alternativa m\u00e1s segura y menos restringida <code>SimpleString<\/code>.<br \/>\nLas cadenas en la plataforma InterSystems IRIS est\u00e1n limitadas a 3,641,144 caracteres, y si desea ejecutar un bloque de c\u00f3digo m\u00e1s largo, debe utilizar flujos.<br \/>\nSe aceptan dos argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 cadena o flujo de c\u00f3digo Python para ejecutar.<\/li>\n<li><code>variable<\/code> \u2014 (opcional) asigna el resultado de la ejecuci\u00f3n <code>code<\/code> a esta variable de Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ejemplo de uso:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).ExecuteCode(\"2*3\", \"y\").<\/code><\/pre>\n<p><\/p>\n<p>En este ejemplo, multiplicamos 2 por 3 y guardamos el resultado en una variable de Python <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Transmisi\u00f3n de datos<\/h2>\n<p><\/p>\n<p>Transfiera datos entre Python y de vuelta.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Hay 4 maneras de obtener el valor de la variable de Python en InterSystems IRIS, dependiendo de la serializaci\u00f3n que necesite:<\/p>\n<p><\/p>\n<ul>\n<li><code>String<\/code> para tipos de datos simples y depuraci\u00f3n.<\/li>\n<li><code>Repr<\/code> para el almacenamiento de objetos simples y la depuraci\u00f3n.<\/li>\n<li><code>JSON<\/code> para la manipulaci\u00f3n f\u00e1cil de datos en el lado de InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> para guardar objetos.<\/li>\n<\/ul>\n<p><\/p>\n<p>Estos m\u00e9todos permiten obtener variables de Python en forma de cadenas o flujos.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 obtener <code>serialization<\/code> variable <code>variable<\/code> en <code>stream<\/code>. Si <code>useString<\/code> igual a 1 y si la serializaci\u00f3n se coloca en una cadena, se devuelve una cadena en lugar de un flujo.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 obtener la serializaci\u00f3n JSON de la variable.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 obtener la serializaci\u00f3n Pickle (o Dill) de la variable.<\/li>\n<\/ul>\n<p><\/p>\n<p>Intentemos obtener nuestra variable <code>y<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).GetVariable(\"y\", , .val, 1)\nwrite val\n&gt;6<\/code><\/pre>\n<p><\/p>\n<h3 id=\"intersystems-iris---python\">InterSystems IRIS -&gt; Python<\/h3>\n<p><\/p>\n<p>Cargamos datos de InterSystems IRIS en Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 crea un conjunto de datos (pandas <code>dataframe<\/code> o <code>list<\/code>) desde una consulta SQL y lo establece en una variable de Python <code>variable<\/code>. El paquete <code>isc.py<\/code> debe estar disponible en el \u00e1mbito <code>namespace<\/code> \u2014 donde se ejecutar\u00e1 la consulta.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 carga datos globales <code>global<\/code> del sub\u00edndice <code>start<\/code> hasta <code>end<\/code> en Python como una variable de tipo <code>tipo<\/code>: <code>list<\/code>, o pandas <code>dataframe<\/code>. La descripci\u00f3n de los argumentos opcionales <code>mask<\/code> y <code>labels<\/code> est\u00e1 disponible en la documentaci\u00f3n de la clase y el repositorio <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentos de Transferencia de Datos<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 carga datos de la clase <code>class<\/code> por id <code>start<\/code> hasta <code>end<\/code> en Python como una variable de tipo <code>tipo<\/code>: <code>list<\/code>, o pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 lista (separador \u2013 coma) de propiedades de la clase que se deben cargar en el conjunto de datos. Se admiten m\u00e1scaras <code>*<\/code> y <code>?<\/code>. Por defecto \u2014 <code>*<\/code> (todas las propiedades). La propiedad <code>%%CLASSNAME<\/code> se ignora.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 carga datos de la tabla <code>tabla<\/code> por id <code>start<\/code> hasta <code>end<\/code> en Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 es universal (cualquier consulta SQL v\u00e1lida se pasar\u00e1 a Python). Sin embargo, <code>ExecuteGlobal<\/code> y sus envolturas <code>ExecuteClass<\/code> y <code>ExecuteTable<\/code> funcionan con varias limitaciones. Son mucho m\u00e1s r\u00e1pidos (3-5 veces m\u00e1s r\u00e1pidos que el controlador ODBC y 20 veces m\u00e1s r\u00e1pidos <code>ExecuteQuery<\/code>). M\u00e1s informaci\u00f3n en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentos de Transferencia de Datos<\/a><\/noindex>.<br \/>\nTodos estos m\u00e9todos admiten la transferencia de datos desde cualquier \u00e1mbito. El paquete <code>isc.py<\/code> debe estar disponible en el \u00e1mbito de destino.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 paso de los resultados de cualquier consulta SQL v\u00e1lida a Python. Este es el m\u00e9todo m\u00e1s lento de transferencia de datos. Util\u00edzalo si <code>ExecuteGlobal<\/code> y sus envolturas no est\u00e1n disponibles.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 consulta SQL.<\/li>\n<li><code>variable<\/code> \u2014 nombre de la variable de Python en la que se escriben los datos.<\/li>\n<li><code>tipo<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 \u00e1mbito en el que se ejecutar\u00e1 la consulta.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeglobal\">ExecuteGlobal<\/h3>\n<p><\/p>\n<p><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 paso de un global a Python.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 nombre del global sin <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 nombre de la variable de Python en la que se escriben los datos.<\/li>\n<li><code>tipo<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 primer sub\u00edndice del global. Obligatorio <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 \u00faltimo sub\u00edndice del global. Obligatorio <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 m\u00e1scara de valores global. La m\u00e1scara puede ser m\u00e1s corta que la cantidad de campos en el global (en este caso, los campos al final se omitir\u00e1n). C\u00f3mo formatear la m\u00e1scara:\n<ul>\n<li><code>+<\/code> transmitir el valor tal cual.<\/li>\n<li><code>-<\/code> omitir el valor.<\/li>\n<li><code>b<\/code> \u2014 Tipo l\u00f3gico (<code>0<\/code> \u2014 <code>False<\/code>, todo lo dem\u00e1s \u2014 <code>Verdadero<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Fecha (desde $horolog, en Windows desde 1970, en Linux desde 1900).<\/li>\n<li><code>t<\/code> \u2014 Hora ($horolog, segundos despu\u00e9s de medianoche).<\/li>\n<li><code>m<\/code> \u2014 Marca de tiempo (string en formato A\u00d1O-MES-D\u00cdA HORA:MINUTO:SEGUNDO).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Lista de nombres de columnas. El primer elemento \u2014 nombre del subscript.<\/li>\n<li><code>namespace<\/code> \u2014 \u00e1mbito en el que se ejecutar\u00e1 la consulta.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Envoltorio sobre <code>ExecuteGlobal<\/code>. Basado en la definici\u00f3n de la clase, prepara la llamada <code>ExecuteGlobal<\/code> y la ejecuta.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 transmisi\u00f3n de datos de clase en Python.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>class<\/code> \u2014 nombre de la clase<\/li>\n<li><code>variable<\/code> \u2014 nombre de la variable de Python en la que se escriben los datos.<\/li>\n<li><code>tipo<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 Id inicial.<\/li>\n<li><code>end<\/code> \u2014 Id final<\/li>\n<li><code>properties<\/code> \u2014 lista (separador \u2013 coma) de propiedades de la clase que se deben cargar en el conjunto de datos. Se admiten m\u00e1scaras <code>*<\/code> y <code>?<\/code>. Por defecto \u2014 <code>*<\/code> (todas las propiedades). La propiedad <code>%%CLASSNAME<\/code> se ignora.<\/li>\n<li><code>namespace<\/code> \u2014 \u00e1mbito en el que se ejecutar\u00e1 la consulta.<\/li>\n<\/ul>\n<p><\/p>\n<p>Todas las propiedades se transmiten tal cual, excepto las propiedades de tipos <code>te<\/code>, <code>%Hora<\/code>, <code>%Booleano<\/code> y <code>%Marca de tiempo<\/code> \u2014 se convierten a las clases correspondientes de Python.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Envoltorio sobre <code>ExecuteClass<\/code>. Transmite el nombre de la tabla al nombre de clase y ejecuta <code>ExecuteClass<\/code>. Firma:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 transmisi\u00f3n de datos de tabla en Python.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>tabla<\/code> \u2014 nombre de la tabla.<br \/>\nTodos los dem\u00e1s argumentos se transmiten tal cual a <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Notas<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> y <code>ExecuteTable<\/code> funcionan a la misma velocidad.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 veces m\u00e1s r\u00e1pido que <code>ExecuteQuery<\/code> en conjuntos de datos grandes (tiempo de transmisi\u00f3n &gt;0.01 segundos).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> y <code>ExecuteTable<\/code> funcionan en globals con esta estructura: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> donde <code>key<\/code> \u2014 n\u00famero entero.<\/li>\n<li>Para <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> y <code>ExecuteTable<\/code> rango de valores soportado <code>te<\/code> corresponde al rango <code>mktime<\/code> y depende del SO (<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/mktime-mktime32-mktime64?view=vs-2019\">windows<\/a><\/noindex>: 1970-01-01, <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/3\/mktime\">linux<\/a><\/noindex> 1900-01-01, <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/System\/Conceptual\/ManPages_iPhoneOS\/man3\/mktime.3.html\">mac<\/a><\/noindex>). Use <code>%Marca de tiempo<\/code>para transmitir datos fuera de este rango o use pandas dataframe ya que esta restricci\u00f3n es solo para la lista.<\/li>\n<li>Para <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> y <code>ExecuteTable<\/code> todos los argumentos excepto la fuente de datos (global, clase o tabla) y la variable son opcionales.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Ejemplos<\/h2>\n<p><\/p>\n<p>Clase de prueba <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> contiene un m\u00e9todo que muestra todas las opciones de transmisi\u00f3n de datos:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set global = \"isc.py.test.PersonD\"\nset class = \"isc.py.test.Person\"\nset table = \"isc_py_test.Person\"\nset query = \"SELECT * FROM isc_py_test.Person\"\n\n\/\/ Argumentos comunes\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ M\u00e9todo 0: ExecuteGlobal sin argumentos\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ M\u00e9todo 1: ExecuteGlobal con argumentos\n\/\/ Al proporcionar el global, los nombres de los campos se establecen manualmente\n\/\/ globalKey - nombre del sub\u00edndice\nset labels = $lb(\"globalKey\", \"Name\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask contiene un elemento menos que labels porque \"globalKey\" - nombre del sub\u00edndice\n\/\/ Omitimos %%CLASSNAME\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ M\u00e9todo 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ M\u00e9todo 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ M\u00e9todo 4: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Llama al m\u00e9todo <code>do ##class(isc.py.test.Person).Test()<\/code> para ver c\u00f3mo funcionan todos los m\u00e9todos de transmisi\u00f3n de datos.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">M\u00e9todos auxiliares<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 obtener informaci\u00f3n sobre la variable: si est\u00e1 definida, su clase y la longitud de la serializaci\u00f3n.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 determina si la variable est\u00e1 definida.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 obtener la clase de la variable.<\/li>\n<li><code>GetStatus()<\/code> \u2014 obtener y eliminar la \u00faltima excepci\u00f3n del lado de Python.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 obtener la variable del m\u00f3dulo y el estado de importaci\u00f3n.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 obtener informaci\u00f3n sobre la funci\u00f3n.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilidad<\/h1>\n<p><\/p>\n<p>Has aprendido a llamar a Python Gateway desde la terminal, ahora empecemos a usarlo en producci\u00f3n. La base de la interacci\u00f3n con Python en este modo es <code>isc.py.ens.Operation<\/code>. Permite:<\/p>\n<p><\/p>\n<ul>\n<li>Ejecutar c\u00f3digo en Python<\/li>\n<li>Guardar\/Restaurar el contexto de Python<\/li>\n<li>Cargar y obtener datos de Python<\/li>\n<\/ul>\n<p><\/p>\n<p>En principio, la operaci\u00f3n Pyhton es un envoltorio sobre <code>isc.py.Main<\/code>. La operaci\u00f3n <code>isc.py.ens.Operation<\/code> ofrece la posibilidad de interactuar con el proceso de Python desde las producciones de InterSystems IRIS. Se admiten cinco solicitudes:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> para ejecutar c\u00f3digo de Python. Devuelve <code>isc.py.msg.ExecutionResponse<\/code> con el resultado de la ejecuci\u00f3n y los valores de las variables solicitadas.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> para ejecutar c\u00f3digo de Python. Devuelve <code>isc.py.msg.StreamExecutionResponse<\/code> con el resultado de la ejecuci\u00f3n y los valores de las variables solicitadas. An\u00e1logo <code>isc.py.msg.ExecutionRequest<\/code>, pero acepta y devuelve flujos en lugar de cadenas.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> para pasar el resultado de la ejecuci\u00f3n de la consulta SQL. Devuelve <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code>\/<code>isc.py.msg.ClassRequest<\/code>\/<code>isc.py.msg.TableRequest<\/code> para la transmisi\u00f3n de datos global\/clase\/tabla. Devuelve <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> para guardar el contexto de Python. Devuelve <code>Ens.StringResponse<\/code> con el identificador de contexto.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> para restaurar el contexto de Python.<\/p>\n<p><\/p>\n<p>Adem\u00e1s, <code>isc.py.ens.Operation<\/code> tiene dos configuraciones:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 selecci\u00f3n de la clase que implementa la interfaz <code>isc.py.init.Abstract<\/code>. Puede ser utilizado para cargar funciones, m\u00f3dulos, clases, etc. Se ejecuta una vez al iniciar el proceso.<\/li>\n<li><code>PythonLib<\/code> \u2014 (solo para Linux) si ves errores al cargar, establece su valor en <code>libpython3.6m.so<\/code> o incluso en la ruta completa a la biblioteca de Python. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Creaci\u00f3n de procesos de negocio<\/h2>\n<p><\/p>\n<p>Hay dos clases disponibles que facilitan el desarrollo de procesos de negocio:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> permite extraer anotaciones de las actividades con sustituci\u00f3n de variables.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> permite probar f\u00e1cilmente los procesos de negocio con Python. Puede ejecutar el proceso de negocio (partes en el lenguaje Python) en el proceso actual.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Sustituci\u00f3n de variables.<\/h2>\n<p><\/p>\n<p>Todos los procesos de negocio que heredan de <code>isc.py.ens.ProcessUtils<\/code>, pueden utilizar el m\u00e9todo <code>GetAnnotation(name)<\/code> para obtener el valor de la anotaci\u00f3n de la actividad por su nombre. La anotaci\u00f3n de la actividad puede contener variables que se calcular\u00e1n en el lado de InterSystems IRIS antes de ser pasadas a Python. Aqu\u00ed est\u00e1 la sintaxis para la sustituci\u00f3n de variables:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 llamada al m\u00e9todo<\/li>\n<li><code>#{expr}<\/code> \u2014 ejecutar c\u00f3digo en ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Un ejemplo est\u00e1 disponible en el proceso de negocio de prueba <code>isc.py.test.Process<\/code>, por ejemplo, en la actividad <code>Matriz de Correlaci\u00f3n: Gr\u00e1fico<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. En este ejemplo:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> devuelve la propiedad WorkDirectory del objeto <code>procesar<\/code>, que es una instancia de la clase <code>isc.py.test.Process<\/code> es decir, el proceso de negocio actual.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> se llama al m\u00e9todo <code>Integer<\/code> de la clase <code>%PopulateUtils<\/code>, pasando argumentos <code>1<\/code> y <code>100<\/code>, devolviendo un n\u00famero entero aleatorio en el rango <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Proceso de negocio de prueba<\/h2>\n<p><\/p>\n<p>El producto de prueba y el proceso de negocio de prueba est\u00e1n disponibles por defecto como parte de Python Gateway. Para usarlos:<\/p>\n<p><\/p>\n<ol>\n<li>Ejecuta en el terminal del sistema operativo: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>Ejecuta en el terminal de InterSystems IRIS: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> para llenar los datos de prueba.<\/li>\n<li>Ejecuta el producto <code>isc.py.test.Production<\/code>.<\/li>\n<li>Enviar una solicitud de tipo <code>Ens.Request<\/code> en <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Veamos c\u00f3mo funciona todo esto junto. Abre <code>isc.py.test.Process<\/code> en el editor BPL:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/6f83b22e0167e2699d285f3e32bfe373.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"ispolnenie-koda-1\">Ejecuci\u00f3n de c\u00f3digo<\/h3>\n<p><\/p>\n<p>La llamada m\u00e1s importante es la ejecuci\u00f3n de c\u00f3digo Python:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se utiliza la solicitud <code>isc.py.msg.ExecutionRequest<\/code>, aqu\u00ed est\u00e1n sus propiedades:<\/p>\n<p><\/p>\n<ul>\n<li><code>C\u00f3digo<\/code> \u2014 c\u00f3digo Python.<\/li>\n<li><code>SeparateLines<\/code> \u2014 si dividir el c\u00f3digo en l\u00edneas para su ejecuci\u00f3n. <code>$c(10)<\/code> (<code>n<\/code>) se utiliza para separar l\u00edneas. Tenga en cuenta que NO se recomienda procesar el mensaje completo de una vez; esta funci\u00f3n est\u00e1 destinada \u00fanicamente a la manipulaci\u00f3n de <code>def<\/code> y expresiones multil\u00ednea similares. Por defecto <code>0<\/code>.<\/li>\n<li><code>Variables<\/code> \u2013 una lista de variables separadas por comas que se incluir\u00e1n en la respuesta.<\/li>\n<li><code>Serializaci\u00f3n<\/code> \u2013 C\u00f3mo serializar las variables que queremos retornar. Opciones: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> y <code>Dill<\/code>, por defecto <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>En nuestro caso, solo estamos configurando la propiedad <code>C\u00f3digo<\/code>, as\u00ed que todas las dem\u00e1s propiedades utilizan valores por defecto. La establecemos llamando a <code>process.GetAnnotation(\"Import pandas\")<\/code>, que en tiempo de ejecuci\u00f3n devuelve la anotaci\u00f3n tras realizar la sustituci\u00f3n de variables. Al final, el c\u00f3digo <code>import pandas as pd<\/code> se pasar\u00e1 a Python. <code>GetAnnotation<\/code> puede ser \u00fatil para obtener scripts de Python multil\u00ednea, pero no hay restricciones en este m\u00e9todo para obtener el c\u00f3digo. Se puede establecer la propiedad <code>C\u00f3digo<\/code> de cualquier forma que le resulte conveniente.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Obtenci\u00f3n de variables<\/h3>\n<p><\/p>\n<p>Otro desaf\u00edo interesante utilizando <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Matriz de correlaci\u00f3n: tabular<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Calcula la matriz de correlaci\u00f3n en el lado de Python y extrae la variable <code>corrmat<\/code> de vuelta a InterSystems IRIS en formato JSON, ajustando las propiedades de la solicitud:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variables<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serializaci\u00f3n<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Podemos ver los resultados en Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y si necesitamos este valor en BP, se puede obtener as\u00ed: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Transmisi\u00f3n de datos<\/h3>\n<p><\/p>\n<p>A continuaci\u00f3n, hablemos sobre la transferencia de datos de InterSystems IRIS a Python; todas las solicitudes de transferencia de datos implementan la interfaz <code>isc.py.msg.DataRequest<\/code>, que proporciona las siguientes propiedades:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variable<\/code> \u2013 variable Python en la que se escriben los datos.<\/li>\n<li><code>Tipo<\/code> \u2013 tipo de variable: <code>dataframe<\/code> (dataframe de pandas) o <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2013 el \u00e1mbito del que obtenemos datos. El paquete <code>isc.py<\/code> debe estar disponible en este \u00e1mbito. Puede ser un \u00e1mbito sin soporte para productos.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sobre la base de esta interfaz, se han implementado 4 clases de solicitudes:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2013 establezca su propiedad <code>Query<\/code> para pasar la consulta SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2013 establezca su propiedad <code>Class<\/code> para pasar datos de clase.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2013 establecer su propiedad <code>Table<\/code> para pasar datos de tabla.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2013 establecer su propiedad <code>Global<\/code> para pasar datos globales.<\/li>\n<\/ul>\n<p><\/p>\n<p>En el proceso de prueba, observe la actividad <code>RAW<\/code>, donde <code>isc.py.msg.QueryRequest<\/code> se muestra en acci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/f6a2a520594341b9d37110bcd24b1015.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"sohranenievosstanovlenie-python-konteksta\">Guardar\/restaurar contexto de Python<\/h3>\n<p><\/p>\n<p>Finalmente, podemos guardar el contexto de Python en InterSystems IRIS; para hacerlo, enviaremos <code>isc.py.msg.SaveRequest<\/code> con los argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2013 Solo se guardan las variables que satisfacen la m\u00e1scara. Se admiten <code>*<\/code> y <code>?<\/code>. Ejemplo: <code>\"Data*, Figure?\"<\/code>. Por defecto <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Longitud m\u00e1xima de la variable guardada. Si la serializaci\u00f3n de la variable es m\u00e1s larga, ser\u00e1 ignorada. Establezca 0 para permitir variables de cualquier longitud. Por defecto <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Nombre<\/code> \u2014 Nombre del contexto (opcional).<\/li>\n<li><code>Descripci\u00f3n<\/code> \u2014 Descripci\u00f3n del contexto (opcional).<\/li>\n<\/ul>\n<p><\/p>\n<p>Devuelve <code>Ens.StringResponse<\/code> con <code>Id<\/code> del contexto guardado. En el proceso de prueba, observe la actividad <code>Guardar contexto<\/code>.<\/p>\n<p><\/p>\n<p>Solicitud correspondiente <code>isc.py.msg.RestoreRequest<\/code> carga el contexto desde InterSystems IRIS en Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identificador del contexto.<\/li>\n<li><code>Limpiar<\/code> \u2014 limpiar el contexto antes de restaurarlo.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"jupyter-notebook\">Jupyter Notebook<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter Notebook<\/a><\/noindex> \u2014 esta es una aplicaci\u00f3n web de c\u00f3digo abierto que permite crear cuadernos que contienen c\u00f3digo, visualizaciones y texto, y publicarlos. Python Gateway permite visualizar y editar procesos BPL como un cuaderno de Jupyter. Tenga en cuenta que actualmente se utiliza un ejecutor est\u00e1ndar de Python 3.<\/p>\n<p><\/p>\n<p>Esta extensi\u00f3n asume que las anotaciones contienen c\u00f3digo Python y utilizan los nombres de las actividades como encabezados precedentes. Ahora es posible desarrollar procesos de negocio PythonGateway en un cuaderno de Jupyter. Esto es lo que es posible: <\/p>\n<p><\/p>\n<ul>\n<li>Crear nuevos procesos de negocio<\/li>\n<li>Eliminar procesos de negocio<\/li>\n<li>Crear nuevas actividades<\/li>\n<li>Modificar actividades<\/li>\n<li>Eliminar actividades<\/li>\n<\/ul>\n<p><\/p>\n<p>Aqu\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">video demostrativo<\/a><\/noindex>. Y algunas capturas de pantalla:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Explorador de procesos<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/6da1aa0a026c34238c57f96e82742bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"redaktor-processa\">Editor de procesos<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway en InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/651031fe9792cc1c5926aa386f4e37fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"ustanovka-1\">Instalaci\u00f3n<\/h2>\n<p><\/p>\n<ol>\n<li>Necesitar\u00e1 InterSystems IRIS 2019.2+.<\/li>\n<li>Instale PythonGateway v0.8+ (solo se requiere <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> y <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Actualice el c\u00f3digo ObjectScript desde el repositorio.<\/li>\n<li>Ejecuta <code>do ##class(isc.py.util.Jupyter).Install()<\/code> y siga las instrucciones.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">La documentaci\u00f3n<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Conclusiones<\/h1>\n<p><\/p>\n<p>MLToolkit es un conjunto de herramientas con el objetivo de integrar modelos y entornos transaccionales, para que los modelos construidos sean f\u00e1cilmente utilizables directamente en sus procesos de negocio. Python Gateway es parte de MLToolkit y proporciona integraci\u00f3n con el lenguaje Python, permitiendo orquestar cualquier algoritmo de aprendizaje autom\u00e1tico creado en Python (el entorno principal para muchos Cient\u00edficos de Datos), utilizando numerosas bibliotecas listas para crear r\u00e1pidamente soluciones anal\u00edticas adaptativas y robotizadas AI\/ML en la plataforma InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Enlaces<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">Art\u00edculo anterior<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openexchange.intersystems.com\/package\/PythonGateway\">Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openexchange.intersystems.com\/package\/Python-Gateway-Samples\">Ejemplos de Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/Convergent-Analytics\">An\u00e1lisis Convergente<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 de 64 bits<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">Documentaci\u00f3n y cursos de Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>El grupo de usuarios de MLToolkit es un repositorio privado de GitHub, creado como parte de la organizaci\u00f3n corporativa de GitHub InterSystems. Est\u00e1 dirigido a usuarios externos que instalan, estudian o ya utilizan los componentes de MLToolkit, incluido el Python Gateway. En el grupo hay disponibles numerosos casos de uso implementados (con c\u00f3digo fuente y datos de prueba) en \u00e1reas como marketing, producci\u00f3n, medicina y muchas otras industrias. Para unirte al grupo de usuarios de ML Toolkit, por favor env\u00eda un breve mensaje por correo electr\u00f3nico a la siguiente direcci\u00f3n: <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com?subject=MLToolkit%20user%20group&amp;body=Hello.%0A%0APlease%20add%20me%20to%20ML%20Toolkit%20user%20group%3A%0A%0A-%20GitHub%20username%3A%20%0A%0A-%20Name%3A%20%0A%0A-%20Company%3A%20%0A%0A-%20Position%3A%0A-%20Country%3A%20%0A%0A\">MLToolkit@intersystems.com<\/a><\/noindex> y especifica en tu correo los siguientes datos:<\/p>\n<p><\/p>\n<ul>\n<li>Nombre de usuario de GitHub<\/li>\n<li>Organizaci\u00f3n (donde trabajas o estudias)<\/li>\n<li>Cargo (su cargo real en su organizaci\u00f3n, o \"Estudiante\", o \"Independiente\").<\/li>\n<li>Pa\u00eds<\/li>\n<\/ul>\n<p><\/p>\n<p>A aquellos que han le\u00eddo el art\u00edculo y est\u00e1n interesados en las capacidades de InterSystems IRIS como plataforma para el desarrollo o la implementaci\u00f3n de mecanismos de inteligencia artificial y aprendizaje autom\u00e1tico, les proponemos discutir posibles escenarios de inter\u00e9s para su empresa. Estamos dispuestos a analizar las necesidades de su negocio y definir conjuntamente un plan de acci\u00f3n; la direcci\u00f3n de correo electr\u00f3nico de nuestro equipo de expertos en AI\/ML es <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/486984\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":41222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-41221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Python Gateway \u0432 InterSystems IRIS | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-06T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-06T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Python Gateway en InterSystems IRIS | ProHoster","description":"Este art\u00edculo est\u00e1 dedicado al Python Gateway, un proyecto de comunidad de c\u00f3digo abierto para la plataforma de datos InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Python Gateway \u0432 InterSystems IRIS | ProHoster","og:description":"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS.","og:url":"https:\/\/prohoster.info\/es\/blog\/python-gateway-v-intersystems-iris","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-06T17:42:46+00:00","article:modified_time":"2020-02-06T17:42:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"41221","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:21:33","updated":"2022-09-30 00:32:37","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}