{"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\/pt\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Gateway Python no InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Este artigo \u00e9 sobre o Python Gateway \u2014 um projeto comunit\u00e1rio de c\u00f3digo aberto para a plataforma de dados InterSystems IRIS. Este projeto permite orquestrar quaisquer algoritmos de aprendizado de m\u00e1quina criados na linguagem Python (o ambiente principal para muitos Cientistas de Dados), utilizando in\u00fameras bibliotecas prontas para a cria\u00e7\u00e3o r\u00e1pida de solu\u00e7\u00f5es anal\u00edticas adaptativas e automatizadas de AI\/ML na plataforma InterSystems IRIS. Neste artigo, mostrarei como o InterSystems IRIS pode orquestrar processos em Python, realizar transfer\u00eancia de dados bidirecional de forma eficiente e criar processos de neg\u00f3cios inteligentes.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"plan\">Plano<\/h1>\n<p><\/p>\n<ol>\n<li>Introdu\u00e7\u00e3o.<\/li>\n<li>Ferramentas.<\/li>\n<li>Instala\u00e7\u00e3o.<\/li>\n<li>API.<\/li>\n<li>Interoperabilidade.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Conclus\u00f5es.<\/li>\n<li>Links.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introdu\u00e7\u00e3o<\/h1>\n<p><\/p>\n<p>Python \u00e9 uma linguagem de programa\u00e7\u00e3o de alto n\u00edvel, de prop\u00f3sito geral, voltada para aumentar a produtividade do desenvolvedor e a legibilidade do c\u00f3digo. Nesta s\u00e9rie de artigos, falarei sobre as possibilidades de aplica\u00e7\u00e3o da linguagem Python na plataforma InterSystems IRIS, com o foco principal deste artigo sendo a utiliza\u00e7\u00e3o do Python como linguagem para a cria\u00e7\u00e3o e aplica\u00e7\u00e3o de modelos de aprendizado de m\u00e1quina.<\/p>\n<p><\/p>\n<p>Aprendizado de m\u00e1quina (ML) \u00e9 uma classe de m\u00e9todos de intelig\u00eancia artificial, cuja caracter\u00edstica \u00e9 n\u00e3o resolver a tarefa diretamente, mas aprender ao resolver muitas tarefas semelhantes. <\/p>\n<p><\/p>\n<p>Os algoritmos e modelos de aprendizado de m\u00e1quina est\u00e3o se tornando cada vez mais comuns. H\u00e1 muitas raz\u00f5es para isso, mas tudo se resume \u00e0 acessibilidade, simplicidade e \u00e0 obten\u00e7\u00e3o de resultados pr\u00e1ticos. A clusteriza\u00e7\u00e3o ou at\u00e9 mesmo a modelagem por rede neural \u00e9 uma nova tecnologia? <\/p>\n<p><\/p>\n<p>Claro que n\u00e3o, mas atualmente n\u00e3o \u00e9 necess\u00e1rio escrever centenas de milhares de linhas de c\u00f3digo para executar um \u00fanico modelo, e os custos para criar e aplicar modelos est\u00e3o diminuindo cada vez mais.<\/p>\n<p><\/p>\n<p>As ferramentas est\u00e3o evoluindo \u2014 enquanto n\u00e3o temos ferramentas de AI\/ML totalmente orientadas para GUI, o progresso que observamos em muitas outras classes de sistemas de informa\u00e7\u00e3o, como BI (desde a codifica\u00e7\u00e3o at\u00e9 o uso de frameworks e solu\u00e7\u00f5es configur\u00e1veis orientadas a GUI), tamb\u00e9m est\u00e1 presente nas ferramentas de cria\u00e7\u00e3o de AI\/ML. J\u00e1 passamos pela fase de codifica\u00e7\u00e3o e hoje utilizamos frameworks para construir e treinar modelos.<\/p>\n<p><\/p>\n<p>Outras melhorias, como a capacidade de distribuir um modelo pr\u00e9-treinado, onde o usu\u00e1rio final precisa apenas concluir o treinamento do modelo com seus dados espec\u00edficos, tamb\u00e9m simplificam o in\u00edcio da aplica\u00e7\u00e3o de aprendizado de m\u00e1quina. Essas conquistas tornam o aprendizado de m\u00e1quina muito mais acess\u00edvel, tanto para especialistas quanto para empresas em geral.<\/p>\n<p><\/p>\n<p>Por outro lado, estamos coletando cada vez mais dados. Gra\u00e7as a uma plataforma de dados unificada, como o InterSystems IRIS, toda essa informa\u00e7\u00e3o pode ser imediatamente preparada e utilizada como dados de entrada para modelos de aprendizado de m\u00e1quina.<\/p>\n<p><\/p>\n<p>Com a migra\u00e7\u00e3o para a nuvem, iniciar projetos de IA\/ML se torna mais f\u00e1cil do que nunca. Podemos consumir apenas os recursos de que precisamos. Al\u00e9m disso, gra\u00e7as \u00e0 paraleliza\u00e7\u00e3o oferecida pelas plataformas em nuvem, podemos economizar tempo.<\/p>\n<p><\/p>\n<p>Mas e quanto aos resultados? Aqui as coisas se complicam. H\u00e1 uma variedade de ferramentas para constru\u00e7\u00e3o de modelos, das quais falarei a seguir. Construir um bom modelo n\u00e3o \u00e9 simples, mas e depois? Extra\u00e7\u00e3o de valor do uso do modelo por parte das empresas tamb\u00e9m \u00e9 uma tarefa n\u00e3o trivial. A raiz do problema est\u00e1 na separa\u00e7\u00e3o entre cargas anal\u00edticas e transacionais, e nos modelos de dados. Quando treinamos um modelo, geralmente o fazemos com dados hist\u00f3ricos. Mas o lugar para o modelo constru\u00eddo est\u00e1 no processamento de transa\u00e7\u00f5es. De que adianta ter o melhor modelo de detec\u00e7\u00e3o de transa\u00e7\u00f5es fraudulentas se o executamos uma vez por dia? Os fraudadores j\u00e1 se foram com o dinheiro. Precisamos treinar o modelo com dados hist\u00f3ricos, mas tamb\u00e9m devemos aplic\u00e1-lo em tempo real com novos dados que chegam, para que nossos processos de neg\u00f3cios possam agir de acordo com as previs\u00f5es feitas pelo modelo.<\/p>\n<p><\/p>\n<p>O ML Toolkit \u00e9 um conjunto de ferramentas que tem exatamente esse objetivo: integrar modelos e ambientes transacionais, para que os modelos constru\u00eddos possam ser facilmente usados diretamente em seus processos de neg\u00f3cios. O Python Gateway faz parte do ML Toolkit e oferece integra\u00e7\u00e3o com a linguagem Python (da mesma forma que o R Gateway, que \u00e9 parte do ML Toolkit, oferece integra\u00e7\u00e3o com a linguagem R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Ferramentas<\/h1>\n<p><\/p>\n<p>Antes de prosseguirmos, gostaria de descrever algumas ferramentas e bibliotecas para Python que vamos usar mais tarde.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Tecnologias<\/h2>\n<p><\/p>\n<ul>\n<li>Python \u00e9 uma linguagem de programa\u00e7\u00e3o interpretada e de alto n\u00edvel, voltada para prop\u00f3sitos gerais. A principal vantagem da linguagem \u00e9 a vasta biblioteca de bibliotecas matem\u00e1ticas, de ML e AI. Assim como o ObjectScript, \u00e9 uma linguagem orientada a objetos, mas tudo \u00e9 definido dinamicamente, e n\u00e3o estaticamente. Tamb\u00e9m, tudo \u00e9 um objeto. Artigos posteriores pressup\u00f5em um conhecimento superficial da linguagem. Se voc\u00ea deseja come\u00e7ar a aprender, recomendo iniciar com <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">documenta\u00e7\u00e3o<\/a><\/noindex>.<\/li>\n<li>Para nossos pr\u00f3ximos exerc\u00edcios, instale <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bit<\/a><\/noindex>.<\/li>\n<li>IDE: Eu uso <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, mas na verdade existem <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">muitas<\/a><\/noindex>. Se voc\u00ea usa o Atelier, h\u00e1 um plugin do Eclipse para desenvolvedores Python. Se voc\u00ea usa o VS Code, h\u00e1 uma extens\u00e3o para Python. <\/li>\n<li>Notebook: em vez de uma IDE, voc\u00ea pode escrever e compartilhar seus scripts em notebooks online. O mais popular deles \u00e9 <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>Aqui est\u00e1 uma lista (n\u00e3o completa) de bibliotecas para aprendizado de m\u00e1quina:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 um pacote fundamental para c\u00e1lculos precisos.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 estruturas de dados e ferramentas de an\u00e1lise de dados de alto desempenho.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 cria\u00e7\u00e3o de gr\u00e1ficos.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 visualiza\u00e7\u00e3o de dados baseada em matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 m\u00e9todos de aprendizado de m\u00e1quina.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 algoritmos de aprendizado de m\u00e1quina dentro da metodologia de boosting de gradiente (Gradient Boosting).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/radimrehurek.com\/gensim\/\">Gensim<\/a><\/noindex> \u2014 NLP.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/keras.io\/\">Keras<\/a><\/noindex> \u2014 redes neurais.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 plataforma para cria\u00e7\u00e3o de modelos de aprendizado de m\u00e1quina.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 plataforma para cria\u00e7\u00e3o de modelos de aprendizado de m\u00e1quina, voltada para Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML de v\u00e1rios modelos.<\/li>\n<\/ul>\n<p><\/p>\n<p>As tecnologias AI\/ML permitem que os neg\u00f3cios sejam mais eficientes e adapt\u00e1veis. Al\u00e9m disso, hoje essas tecnologias est\u00e3o se tornando mais f\u00e1ceis de desenvolver e implementar. Comece a aprender sobre tecnologias AI\/ML e como elas podem ajudar sua organiza\u00e7\u00e3o a crescer.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Instala\u00e7\u00e3o<\/h1>\n<p><\/p>\n<p>Existem v\u00e1rias maneiras de instalar e usar o Python Gateway:<\/p>\n<p><\/p>\n<ul>\n<li>sistemas operacionais\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>Use uma imagem do DockerHub<\/li>\n<li>Crie sua pr\u00f3pria imagem<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Independentemente do m\u00e9todo de instala\u00e7\u00e3o, voc\u00ea precisar\u00e1 do c\u00f3digo-fonte. O \u00fanico lugar para baixar o c\u00f3digo \u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">p\u00e1gina de lan\u00e7amentos<\/a><\/noindex>. Ela cont\u00e9m lan\u00e7amentos est\u00e1veis testados, \u00e9 s\u00f3 pegar o mais recente. At\u00e9 o momento, \u00e9 0.8, mas novos vir\u00e3o com o tempo. N\u00e3o clone\/carregue o reposit\u00f3rio, baixe o \u00faltimo lan\u00e7amento.<\/p>\n<p><\/p>\n<h2 id=\"os\">sistemas operacionais<\/h2>\n<p><\/p>\n<p>Se voc\u00ea estiver instalando o Python Gateway no sistema operacional, primeiro (independentemente do sistema operacional) voc\u00ea precisa instalar o Python. Para isso:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Instale o Python 3.6.7 64 bits<\/a><\/noindex>. \u00c9 recomendado instalar o Python no diret\u00f3rio padr\u00e3o.<\/li>\n<li>Instale o m\u00f3dulo <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Baixe o c\u00f3digo ObjectScript (ou seja, <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\", , 1)<\/code>) em qualquer namespace com produtos. Caso voc\u00ea queira que um namespace existente suporte produtos, execute: <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> para a pasta <code>bin<\/code> da sua inst\u00e2ncia InterSystems IRIS. O arquivo da biblioteca deve estar dispon\u00edvel no caminho retornado <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>Verifique se a vari\u00e1vel de ambiente <code>PYTHONHOME<\/code> aponta para o Python 3.6.7.<\/li>\n<li>Verifique se a vari\u00e1vel de ambiente do sistema <code>caminhos<\/code> cont\u00e9m a vari\u00e1vel <code>PYTHONHOME<\/code> (ou o diret\u00f3rio para o qual ela aponta).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Verifique se a vari\u00e1vel de ambiente <code>caminhos<\/code> cont\u00e9m <code>\/usr\/lib<\/code> e <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Use o arquivo <code>\/etc\/environment<\/code> para definir as vari\u00e1veis de ambiente.<\/li>\n<li>Em caso de erros <code>undefined symbol: _Py_TrueStruct<\/code> defina a configura\u00e7\u00e3o <code>PythonLib<\/code>. Tamb\u00e9m na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> h\u00e1 uma se\u00e7\u00e3o de Solu\u00e7\u00e3o de Problemas.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Atualmente, apenas Python 3.6.7 do <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Verifique a vari\u00e1vel <code>caminhos<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Se voc\u00ea alterou as vari\u00e1veis de ambiente, reinicie seu produto InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>O uso de cont\u00eaineres tem v\u00e1rias vantagens: <\/p>\n<p><\/p>\n<ul>\n<li>Portabilidade<\/li>\n<li>Efici\u00eancia<\/li>\n<li>Isolamento<\/li>\n<li>Leveza<\/li>\n<li>Imutabilidade<\/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\">s\u00e9rie de artigos<\/a><\/noindex> para obter mais informa\u00e7\u00f5es sobre o uso do Docker com produtos InterSystems. <\/p>\n<p><\/p>\n<p>Todas as compila\u00e7\u00f5es do Python Gateway atualmente s\u00e3o baseadas em cont\u00eaineres <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Imagem pronta<\/h3>\n<p><\/p>\n<p>Execute: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, para baixar e iniciar o Python Gateway com a Edi\u00e7\u00e3o Comunit\u00e1ria do InterSystems IRIS. E \u00e9 isso.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Crie sua pr\u00f3pria imagem<\/h3>\n<p><\/p>\n<p>Para construir a imagem do docker, execute na raiz do reposit\u00f3rio: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nPor padr\u00e3o, a imagem \u00e9 constru\u00edda com base na imagem <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, mas voc\u00ea pode alterar isso definindo a vari\u00e1vel <code>IMAGE<\/code>.<br \/>\nPara construir a partir do InterSystems IRIS, execute: `docker build --build-arg IMAGE=store\/intersystems\/iris:2019.4.0.383.0 --force-rm --tag intersystemscommunity\/irispy:latest `.<\/p>\n<p><\/p>\n<p>Depois disso, voc\u00ea pode iniciar a imagem do 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>Se voc\u00ea estiver usando uma imagem baseada na Edi\u00e7\u00e3o Comunit\u00e1ria do InterSystems IRIS, pode n\u00e3o precisar especificar a chave.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Coment\u00e1rios<\/h3>\n<p><\/p>\n<ul>\n<li>O processo de teste <code>isc.py.test.Process<\/code> salva uma s\u00e9rie de imagens em um diret\u00f3rio tempor\u00e1rio. Voc\u00ea pode querer alterar esse caminho para um diret\u00f3rio montado. Para isso, edite a configura\u00e7\u00e3o <code>WorkingDir<\/code> especificando o diret\u00f3rio montado.<\/li>\n<li>Para acessar o terminal, execute: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Acesso ao Portal de Gerenciamento do Sistema com login <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Para parar o cont\u00eainer, execute: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Verifica\u00e7\u00e3o de instala\u00e7\u00e3o<\/h2>\n<p><\/p>\n<p>Depois de instalar o Python Gateway, vale a pena verificar se ele est\u00e1 funcionando. Execute este c\u00f3digo no terminal 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>O resultado deve ser <code>HELLO<\/code> \u2014 valor da vari\u00e1vel Python <code>x<\/code>. Se o status retornado <code>sc<\/code> \u00e9 um erro ou <code>var<\/code> vazio, verifique <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 se\u00e7\u00e3o de resolu\u00e7\u00e3o de problemas<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway est\u00e1 instalado, e voc\u00ea confirmou que ele est\u00e1 funcionando. Agora \u00e9 hora de come\u00e7ar a us\u00e1-lo!<br \/>\nA interface principal para o Python \u00e9 <code>isc.py.Main<\/code>. Ela oferece os seguintes grupos de m\u00e9todos (todos retornam <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Execu\u00e7\u00e3o de c\u00f3digo<\/li>\n<li>Transmiss\u00e3o de dados<\/li>\n<li>Auxiliares<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Execu\u00e7\u00e3o de c\u00f3digo<\/h2>\n<p><\/p>\n<p>Esses m\u00e9todos permitem executar c\u00f3digo Python arbitr\u00e1rio.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 \u00e9 o m\u00e9todo principal. Ele aceita 4 argumentos opcionais:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 string de c\u00f3digo a ser executada. O s\u00edmbolo de nova linha: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 nome da vari\u00e1vel para retornar.<\/li>\n<li><code>serialization<\/code> \u2014 como serializar <code>returnVariable<\/code>. 0 \u2014 string (padr\u00e3o), 1 \u2014 repr.<\/li>\n<li><code>result<\/code> \u2014 refer\u00eancia ByRef para a vari\u00e1vel na qual o valor \u00e9 gravado <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Acima, executamos:<\/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>Neste exemplo, estamos atribuindo \u00e0 vari\u00e1vel Python <code>x<\/code> valor <code>Ol\u00e1<\/code> e queremos retornar o valor da vari\u00e1vel Python <code>x<\/code> para a vari\u00e1vel ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode \u00e9 uma alternativa mais segura e menos restritiva <code>SimpleString<\/code>.<br \/>\nStrings na plataforma InterSystems IRIS t\u00eam um limite de 3.641.144 caracteres, e se voc\u00ea quiser executar um trecho mais longo de c\u00f3digo, precisar\u00e1 usar streams.<br \/>\nAceita dois argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 string ou stream de c\u00f3digo Python para execu\u00e7\u00e3o.<\/li>\n<li><code>variable<\/code> \u2014 (opcional) atribui o resultado da execu\u00e7\u00e3o <code>code<\/code> para essa vari\u00e1vel Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemplo 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>Neste exemplo, multiplicamos 2 por 3 e gravamos o resultado na vari\u00e1vel Python <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Transmiss\u00e3o de dados<\/h2>\n<p><\/p>\n<p>Envie dados para o Python e de volta.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Existem 4 maneiras de obter o valor da vari\u00e1vel Python no InterSystems IRIS, dependendo da serializa\u00e7\u00e3o que voc\u00ea precisa:<\/p>\n<p><\/p>\n<ul>\n<li><code>String<\/code> para tipos de dados simples e depura\u00e7\u00e3o.<\/li>\n<li><code>Repr<\/code> para armazenamento de objetos simples e depura\u00e7\u00e3o.<\/li>\n<li><code>JSON<\/code> para manipula\u00e7\u00e3o f\u00e1cil de dados no lado do InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> para salvar objetos.<\/li>\n<\/ul>\n<p><\/p>\n<p>Esses m\u00e9todos permitem obter vari\u00e1veis do Python como strings ou fluxos.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 obter <code>serialization<\/code> vari\u00e1vel <code>variable<\/code> em <code>stream<\/code>. Se <code>useString<\/code> \u00e9 igual a 1 e a serializa\u00e7\u00e3o \u00e9 colocada em uma string, ent\u00e3o retorna uma string e n\u00e3o um fluxo.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 obter a serializa\u00e7\u00e3o JSON da vari\u00e1vel.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 obter a serializa\u00e7\u00e3o Pickle (ou Dill) da vari\u00e1vel.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vamos tentar obter nossa vari\u00e1vel <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>Carregando dados do InterSystems IRIS para Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 cria um conjunto de dados (pandas <code>dataframe<\/code> ou <code>list<\/code>) a partir de uma consulta sql e o define em uma vari\u00e1vel do Python <code>variable<\/code>. O pacote <code>isc.py<\/code> deve estar acess\u00edvel no namespace <code>namespace<\/code> \u2014 onde a consulta ser\u00e1 executada.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 carrega dados do global <code>global<\/code> de um subscript <code>start<\/code> at\u00e9 <code>end<\/code> para o Python como uma vari\u00e1vel do tipo <code>tipo<\/code>: <code>list<\/code>, ou pandas <code>dataframe<\/code>. A descri\u00e7\u00e3o dos argumentos opcionais <code>mask<\/code> e <code>labels<\/code> est\u00e1 dispon\u00edvel na documenta\u00e7\u00e3o da classe e no reposit\u00f3rio <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentos de Transfer\u00eancia de Dados<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 carrega dados da classe <code>classe<\/code> de id <code>start<\/code> at\u00e9 <code>end<\/code> para o Python como uma vari\u00e1vel do tipo <code>tipo<\/code>: <code>list<\/code>, ou pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 lista (separador - v\u00edrgula) de propriedades da classe que precisam ser carregadas no conjunto de dados. M\u00e1scaras s\u00e3o suportadas. <code>*<\/code> e <code>?<\/code>. Por padr\u00e3o \u2014 <code>*<\/code> (todas as propriedades). A propriedade <code>%%CLASSNAME<\/code> \u00e9 ignorado.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 carrega dados da tabela <code>table<\/code> de id <code>start<\/code> at\u00e9 <code>end<\/code> para o Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 \u00e9 universal (qualquer consulta SQL v\u00e1lida ser\u00e1 enviada para o Python). No entanto, <code>ExecuteGlobal<\/code> e suas envolt\u00f3rias <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> funcionam com uma s\u00e9rie de restri\u00e7\u00f5es. Eles s\u00e3o muito mais r\u00e1pidos (3 a 5 vezes mais r\u00e1pidos que o driver ODBC e 20 vezes mais r\u00e1pidos <code>ExecuteQuery<\/code>). Mais informa\u00e7\u00f5es em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentos de Transfer\u00eancia de Dados<\/a><\/noindex>.<br \/>\nTodos esses m\u00e9todos suportam a transfer\u00eancia de dados de qualquer namespace. O pacote <code>isc.py<\/code> deve estar acess\u00edvel no namespace 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 transfer\u00eancia dos resultados de qualquer consulta SQL v\u00e1lida para o Python. Este \u00e9 o m\u00e9todo mais lento de transfer\u00eancia de dados. Use-o se <code>ExecuteGlobal<\/code> e suas envolt\u00f3rias n\u00e3o estiverem dispon\u00edveis.<\/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 nome da vari\u00e1vel Python para a qual os dados s\u00e3o gravados.<\/li>\n<li><code>tipo<\/code> \u2014 <code>list<\/code> ou Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 namespace onde a consulta ser\u00e1 executada.<\/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 transfer\u00eancia do global para o Python.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 nome do global sem <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 nome da vari\u00e1vel Python para a qual os dados s\u00e3o gravados.<\/li>\n<li><code>tipo<\/code> \u2014 <code>list<\/code> ou Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 primeiro subscript do global. Obrigat\u00f3rio <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 \u00faltimo subscript do global. Obrigat\u00f3rio <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 m\u00e1scara de valores do global. A m\u00e1scara pode ser mais curta do que o n\u00famero de campos no global (neste caso, os campos no final ser\u00e3o ignorados). Como formatar a m\u00e1scara:\n<ul>\n<li><code>+<\/code> passar o valor como est\u00e1.<\/li>\n<li><code>-<\/code> pular o valor.<\/li>\n<li><code>b<\/code> \u2014 Tipo l\u00f3gico (<code>0<\/code> \u2014 <code>False<\/code>, tudo o mais \u2014 <code>Verdadeiro<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Data (de $horolog, no Windows a partir de 1970, no Linux a partir de 1900).<\/li>\n<li><code>t<\/code> \u2014 Hora ($horolog, segundos ap\u00f3s a meia-noite).<\/li>\n<li><code>m<\/code> \u2014 Timestamp (string no formato ANO-M\u00caS-DIA HORA:MINUTO:SEGUNDO).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Lista de nomes de colunas. O primeiro elemento \u2014 o nome do subscript.<\/li>\n<li><code>namespace<\/code> \u2014 namespace onde a consulta ser\u00e1 executada.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Wrapper sobre <code>ExecuteGlobal<\/code>. Com base na defini\u00e7\u00e3o da classe, prepara a chamada <code>ExecuteGlobal<\/code> e a invoca.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 passagem de dados da classe em Python.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>classe<\/code> \u2014 nome da classe<\/li>\n<li><code>variable<\/code> \u2014 nome da vari\u00e1vel Python para a qual os dados s\u00e3o gravados.<\/li>\n<li><code>tipo<\/code> \u2014 <code>list<\/code> ou 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 - v\u00edrgula) de propriedades da classe que precisam ser carregadas no conjunto de dados. M\u00e1scaras s\u00e3o suportadas. <code>*<\/code> e <code>?<\/code>. Por padr\u00e3o \u2014 <code>*<\/code> (todas as propriedades). A propriedade <code>%%CLASSNAME<\/code> \u00e9 ignorado.<\/li>\n<li><code>namespace<\/code> \u2014 namespace onde a consulta ser\u00e1 executada.<\/li>\n<\/ul>\n<p><\/p>\n<p>Todas as propriedades s\u00e3o passadas como est\u00e3o, exceto as propriedades dos tipos <code>te<\/code>, <code>%Hora<\/code>, <code>%Booleano<\/code> e <code>%Timestamp<\/code> \u2014 eles s\u00e3o convertidos nas respectivas classes do Python.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Wrapper sobre <code>ExecuteClass<\/code>. Transforma o nome da tabela no nome da classe e invoca <code>ExecuteClass<\/code>. Assinatura:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 passagem de dados da tabela em Python.<\/p>\n<p><\/p>\n<p>Argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 nome da tabela.<br \/>\nTodos os outros argumentos s\u00e3o passados como est\u00e3o em <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> e <code>ExecuteTable<\/code> funcionam igualmente r\u00e1pido.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 vezes mais r\u00e1pido do que <code>ExecuteQuery<\/code> em grandes conjuntos de dados (tempo de passagem superior a &gt;0.01 segundo).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> funcionam em globals com esta estrutura: <code>^global(chave) = $lb(prop1, prop2, ..., propN)<\/code> onde <code>key<\/code> \u2014 n\u00famero inteiro.<\/li>\n<li>Para <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> intervalo de valores suportado <code>te<\/code> corresponde ao intervalo <code>mktime<\/code> e depende do 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>%Timestamp<\/code>para passar dados fora deste intervalo ou use pandas dataframe, pois essa \u00e9 uma limita\u00e7\u00e3o apenas para listas.<\/li>\n<li>Para <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> todos os argumentos, exceto a fonte de dados (global, classe ou tabela) e a vari\u00e1vel, s\u00e3o opcionais.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Exemplos<\/h2>\n<p><\/p>\n<p>Classe de teste <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> cont\u00e9m um m\u00e9todo que demonstra todas as op\u00e7\u00f5es de passagem de dados:<\/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 gerais\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ M\u00e9todo 0: ExecuteGlobal sem argumentos\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ M\u00e9todo 1: ExecuteGlobal com argumentos    \n\/\/ Ao passar global, os nomes dos campos s\u00e3o definidos manualmente\n\/\/ globalKey - nome do subscript\nset labels = $lb(\"globalKey\", \"Name\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask cont\u00e9m 1 elemento a menos que labels porque \"globalKey\" - nome do subscript\n\/\/ Ignoramos %%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>Chame o m\u00e9todo <code>do ##class(isc.py.test.Person).Test()<\/code> para ver como todos os m\u00e9todos de transfer\u00eancia de dados funcionam.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">M\u00e9todos auxiliares<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(vari\u00e1vel, serializa\u00e7\u00e3o, .definido, .tipo, .comprimento)<\/code> \u2014 obtenha informa\u00e7\u00f5es sobre a vari\u00e1vel: se est\u00e1 definida, a classe e o comprimento da serializa\u00e7\u00e3o.<\/li>\n<li><code>GetVariableDefined(vari\u00e1vel, .definido)<\/code> \u2014 se a vari\u00e1vel est\u00e1 definida.<\/li>\n<li><code>GetVariableType(vari\u00e1vel, .tipo)<\/code> \u2014 obtenha a classe da vari\u00e1vel.<\/li>\n<li><code>GetStatus()<\/code> \u2014 obtenha e remova a \u00faltima exce\u00e7\u00e3o do lado Python.<\/li>\n<li><code>GetModuleInfo(m\u00f3dulo, .importado, .alias)<\/code> \u2014 obtenha a vari\u00e1vel do m\u00f3dulo e o status da importa\u00e7\u00e3o.<\/li>\n<li><code>GetFunctionInfo(fun\u00e7\u00e3o, .definido, .tipo, .docs, .assinatura, .argumentos)<\/code> \u2014 obtenha informa\u00e7\u00f5es sobre a fun\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilidade<\/h1>\n<p><\/p>\n<p>Voc\u00ea aprendeu a chamar o Python Gateway a partir do terminal, agora vamos come\u00e7ar a us\u00e1-lo em produ\u00e7\u00e3o. A base da intera\u00e7\u00e3o com Python neste modo \u00e9 <code>isc.py.ens.Operation<\/code>. Ele nos permite:<\/p>\n<p><\/p>\n<ul>\n<li>Executar c\u00f3digo em Python<\/li>\n<li>Salvar\/Restaurar o contexto do Python<\/li>\n<li>Carregar e obter dados do Python<\/li>\n<\/ul>\n<p><\/p>\n<p>Basicamente, a opera\u00e7\u00e3o Pyhton \u00e9 uma camada sobre <code>isc.py.Main<\/code>. A opera\u00e7\u00e3o <code>isc.py.ens.Operation<\/code> oferece a possibilidade de interagir com o processo Python a partir de produtos InterSystems IRIS. Cinco solicita\u00e7\u00f5es s\u00e3o suportadas:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> para executar c\u00f3digo Python. Retorna <code>isc.py.msg.ExecutionResponse<\/code> com o resultado da execu\u00e7\u00e3o e os valores das vari\u00e1veis solicitadas.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> para executar c\u00f3digo Python. Retorna <code>isc.py.msg.StreamExecutionResponse<\/code> com o resultado da execu\u00e7\u00e3o e os valores das vari\u00e1veis solicitadas. Semelhante <code>isc.py.msg.ExecutionRequest<\/code>, mas aceita e retorna streams em vez de strings.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> para transferir o resultado da execu\u00e7\u00e3o de uma consulta SQL. Retorna <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 a transmiss\u00e3o de dados global\/classe\/tabela. Retorna <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> para salvar o contexto Python. Retorna <code>Ens.StringResponse<\/code> com o identificador de contexto.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> para restaurar o contexto Python.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, <code>isc.py.ens.Operation<\/code> possui duas configura\u00e7\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 escolha da classe que implementa a interface <code>isc.py.init.Abstract<\/code>. Pode ser usado para carregar fun\u00e7\u00f5es, m\u00f3dulos, classes, etc. \u00c9 executado uma vez ao iniciar o processo.<\/li>\n<li><code>PythonLib<\/code> \u2014 (apenas para Linux) se voc\u00ea ver erros ao carregar, defina seu valor como <code>libpython3.6m.so<\/code> ou at\u00e9 mesmo o caminho completo para a biblioteca Python. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Cria\u00e7\u00e3o de processos de neg\u00f3cios<\/h2>\n<p><\/p>\n<p>Est\u00e3o dispon\u00edveis duas classes que facilitam o desenvolvimento de processos de neg\u00f3cios:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> permite extrair anota\u00e7\u00f5es de atividades com substitui\u00e7\u00e3o de vari\u00e1veis.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> facilita o teste de processos de neg\u00f3cios com Python. Pode executar um processo de neg\u00f3cios (partes em linguagem Python) no processo atual.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Substitui\u00e7\u00e3o de vari\u00e1veis<\/h2>\n<p><\/p>\n<p>Todos os processos de neg\u00f3cios herdados de <code>isc.py.ens.ProcessUtils<\/code>, podem usar o m\u00e9todo <code>GetAnnotation(name)<\/code> para obter o valor da anota\u00e7\u00e3o da atividade pelo seu nome. A anota\u00e7\u00e3o da atividade pode conter vari\u00e1veis, que ser\u00e3o calculadas do lado do InterSystems IRIS antes de serem passadas para o Python. Aqui est\u00e1 a sintaxe de substitui\u00e7\u00e3o de vari\u00e1veis:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 chamar o m\u00e9todo<\/li>\n<li><code>#{expr}<\/code> \u2014 executar c\u00f3digo na linguagem ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Um exemplo est\u00e1 dispon\u00edvel no processo de neg\u00f3cios de teste <code>isc.py.test.Process<\/code>, por exemplo, na atividade <code>Correlation Matrix: Graph<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. Neste exemplo:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> retorna a propriedade WorkDirectory do objeto <code>processo<\/code>, que \u00e9 uma inst\u00e2ncia da classe <code>isc.py.test.Process<\/code> ou seja, do processo de neg\u00f3cios atual.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> chama o m\u00e9todo <code>Inteiro<\/code> classe <code>%PopulateUtils<\/code>, passando argumentos <code>1<\/code> e <code>100<\/code>, retornando um n\u00famero inteiro aleat\u00f3rio no intervalo <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Processo de neg\u00f3cios de teste<\/h2>\n<p><\/p>\n<p>Produto de teste e processo de neg\u00f3cios de teste est\u00e3o dispon\u00edveis por padr\u00e3o como parte do Gateway Python. Para us\u00e1-los:<\/p>\n<p><\/p>\n<ol>\n<li>No terminal do SO, execute: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>No terminal do InterSystems IRIS, execute: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> para preencher os dados de teste.<\/li>\n<li>Inicie o produto <code>isc.py.test.Production<\/code>.<\/li>\n<li>Enviar um pedido do tipo <code>Ens.Request<\/code> em <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Vamos ver como tudo isso funciona junto. Abra <code>isc.py.test.Process<\/code> no editor BPL:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no 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\">Execu\u00e7\u00e3o de c\u00f3digo<\/h3>\n<p><\/p>\n<p>A chamada mais importante \u00e9 a execu\u00e7\u00e3o do c\u00f3digo Python:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Usa a solicita\u00e7\u00e3o <code>isc.py.msg.ExecutionRequest<\/code>, aqui est\u00e3o suas propriedades:<\/p>\n<p><\/p>\n<ul>\n<li><code>C\u00f3digo<\/code> \u2014 c\u00f3digo Python.<\/li>\n<li><code>SeparateLines<\/code> \u2014 separar o c\u00f3digo em linhas para execu\u00e7\u00e3o. <code>$c(10)<\/code> (<code>n<\/code>) \u00e9 usado para separar linhas. Observe que N\u00c3O \u00e9 recomend\u00e1vel processar a mensagem inteira de uma s\u00f3 vez, esta fun\u00e7\u00e3o \u00e9 destinada apenas para processamento <code>def<\/code> e express\u00f5es multilinha semelhantes. Por padr\u00e3o <code>0<\/code>.<\/li>\n<li><code>Vari\u00e1veis<\/code> \u2014 uma lista de vari\u00e1veis separadas por v\u00edrgulas que ser\u00e3o adicionadas \u00e0 resposta.<\/li>\n<li><code>Serializa\u00e7\u00e3o<\/code> \u2014 Como serializar as vari\u00e1veis que queremos retornar. Op\u00e7\u00f5es: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> e <code>Dill<\/code>, por padr\u00e3o <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>No nosso caso, estamos apenas definindo a propriedade <code>C\u00f3digo<\/code>, para que todas as outras propriedades usem os valores padr\u00e3o. Estamos definindo isso chamando <code>process.GetAnnotation(\"Import pandas\")<\/code>, que durante a execu\u00e7\u00e3o retorna a anota\u00e7\u00e3o ap\u00f3s a substitui\u00e7\u00e3o de vari\u00e1veis. No final, o c\u00f3digo <code>import pandas as pd<\/code> ser\u00e1 passado para o Python. <code>GetAnnotation<\/code> pode ser \u00fatil para obter scripts Python multilinha, mas n\u00e3o h\u00e1 restri\u00e7\u00f5es para esse m\u00e9todo de obten\u00e7\u00e3o de c\u00f3digo. Voc\u00ea pode definir a propriedade <code>C\u00f3digo<\/code> de qualquer maneira que lhe convier.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Obten\u00e7\u00e3o de vari\u00e1veis<\/h3>\n<p><\/p>\n<p>Mais um chamado interessante usando <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Matriz de Correla\u00e7\u00e3o: Tabular<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ele calcula a Matriz de Correla\u00e7\u00e3o no lado do Python e extrai a vari\u00e1vel <code>corrmat<\/code> de volta ao InterSystems IRIS no formato JSON, configurando as propriedades da requisi\u00e7\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li><code>Vari\u00e1veis<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serializa\u00e7\u00e3o<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Podemos ver os resultados no Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se precisarmos desse valor no BP, ele pode ser obtido assim: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Transmiss\u00e3o de dados<\/h3>\n<p><\/p>\n<p>Agora vamos falar sobre a transfer\u00eancia de dados do InterSystems IRIS para o Python, todas as requisi\u00e7\u00f5es de transfer\u00eancia de dados implementam a interface <code>isc.py.msg.DataRequest<\/code>, que fornece as seguintes propriedades:<\/p>\n<p><\/p>\n<ul>\n<li><code>Vari\u00e1vel<\/code> \u2014 a vari\u00e1vel Python para a qual os dados s\u00e3o escritos.<\/li>\n<li><code>Tipo<\/code> \u2014 o tipo de vari\u00e1vel: <code>dataframe<\/code> (dataframe pandas) ou <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 o escopo do qual obtemos os dados. O pacote <code>isc.py<\/code> deve estar dispon\u00edvel nesse escopo. Pode ser um escopo sem suporte a produtos.<\/li>\n<\/ul>\n<p><\/p>\n<p>Com base nessa interface, 4 classes de requisi\u00e7\u00f5es foram implementadas:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 defina a propriedade <code>Query<\/code> para passar uma consulta SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 defina a propriedade <code>Classe<\/code> para passar dados de classe.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 defina a propriedade <code>Tabela<\/code> para passar dados da tabela.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 defina a propriedade <code>Global<\/code> para passar dados globais.<\/li>\n<\/ul>\n<p><\/p>\n<p>No processo de teste, observe a atividade <code>RAW<\/code>, onde <code>isc.py.msg.QueryRequest<\/code> mostra em a\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no 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\">Salvamento\/restaura\u00e7\u00e3o do contexto Python<\/h3>\n<p><\/p>\n<p>Finalmente, podemos salvar o contexto Python no InterSystems IRIS, para fazer isso, enviaremos <code>isc.py.msg.SaveRequest<\/code> com os argumentos:<\/p>\n<p><\/p>\n<ul>\n<li><code>M\u00e1scara<\/code> \u2014 Somente as vari\u00e1veis que atendem \u00e0 m\u00e1scara s\u00e3o salvas. S\u00e3o suportadas <code>*<\/code> e <code>?<\/code>. Exemplo: <code>\"Data*, Figure?\"<\/code>. Por padr\u00e3o, <code>*<\/code>.<\/li>\n<li><code>ComprimentoM\u00e1ximo<\/code> \u2014 Comprimento m\u00e1ximo da vari\u00e1vel armazenada. Se a serializa\u00e7\u00e3o da vari\u00e1vel for mais longa, ela ser\u00e1 ignorada. Defina 0 para permitir vari\u00e1veis de qualquer comprimento. Por padr\u00e3o <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Nome<\/code> \u2014 Nome do contexto (opcional).<\/li>\n<li><code>Descri\u00e7\u00e3o<\/code> \u2014 Descri\u00e7\u00e3o do contexto (opcional).<\/li>\n<\/ul>\n<p><\/p>\n<p>Retorna <code>Ens.StringResponse<\/code> com <code>Id<\/code> do contexto salvo. No processo de teste, observe a atividade <code>Salvar Contexto<\/code>.<\/p>\n<p><\/p>\n<p>A solicita\u00e7\u00e3o correspondente <code>isc.py.msg.RestoreRequest<\/code> carrega o contexto do InterSystems IRIS para o Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identificador do contexto.<\/li>\n<li><code>Limpar<\/code> \u2014 limpar o contexto antes da restaura\u00e7\u00e3o.<\/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 \u00e9 um aplicativo web de c\u00f3digo aberto que permite criar notebooks contendo c\u00f3digo, visualiza\u00e7\u00f5es e texto e public\u00e1-los. O Python Gateway permite visualizar e editar processos BPL como Jupyter Notebooks. Observe que atualmente est\u00e1 sendo usado o executor padr\u00e3o do Python 3.<\/p>\n<p><\/p>\n<p>Esta extens\u00e3o presume que as anota\u00e7\u00f5es cont\u00eam c\u00f3digo Python e usam nomes de atividades como cabe\u00e7alhos anteriores. Agora \u00e9 poss\u00edvel desenvolver processos de neg\u00f3cios PythonGateway no Jupyter Notebook. Aqui est\u00e1 o que \u00e9 poss\u00edvel: <\/p>\n<p><\/p>\n<ul>\n<li>Criar novos processos de neg\u00f3cios<\/li>\n<li>Excluir processos de neg\u00f3cios<\/li>\n<li>Criar novas atividades<\/li>\n<li>Modificar atividades<\/li>\n<li>Excluir atividades<\/li>\n<\/ul>\n<p><\/p>\n<p>Aqui <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">demonstra\u00e7\u00e3o em v\u00eddeo<\/a><\/noindex>. E algumas capturas de tela:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Explorador de Processos<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no 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 Processos<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gateway Python no 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\">Instala\u00e7\u00e3o<\/h2>\n<p><\/p>\n<ol>\n<li>Voc\u00ea precisar\u00e1 do InterSystems IRIS 2019.2+.<\/li>\n<li>Instale o PythonGateway v0.8+ (somente necess\u00e1rio <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> e <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Atualize o c\u00f3digo ObjectScript do reposit\u00f3rio.<\/li>\n<li>Execute <code>do ##class(isc.py.util.Jupyter).Install()<\/code> e siga as instru\u00e7\u00f5es.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Documenta\u00e7\u00e3o<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Como resultado, obtemos um servi\u00e7o de \"monitoramento como servi\u00e7o\", automatizado na linha de produ\u00e7\u00e3o de integra\u00e7\u00e3o cont\u00ednua. O desenvolvedor ou testador precisa apenas definir a lista de m\u00e9tricas em um arquivo JSON, e tudo o mais acontece automaticamente. Obtemos um controle de qualidade transparente dos lan\u00e7amentos: todas as notifica\u00e7\u00f5es sobre desempenho, consumo de recursos ou regress\u00f5es arquitet\u00f4nicas.<\/h1>\n<p><\/p>\n<p>MLToolkit \u00e9 um conjunto de ferramentas cujo objetivo \u00e9 integrar modelos e ambientes de transa\u00e7\u00e3o, permitindo que os modelos constru\u00eddos sejam facilmente utilizados diretamente em seus processos de neg\u00f3cios. O Python Gateway \u00e9 parte do MLToolkit e fornece integra\u00e7\u00e3o com a linguagem Python, permitindo orquestrar quaisquer algoritmos de aprendizado de m\u00e1quina criados em Python (o ambiente principal para muitos Cientistas de Dados), utilizando in\u00fameras bibliotecas prontas para a constru\u00e7\u00e3o r\u00e1pida de solu\u00e7\u00f5es anal\u00edticas de IA\/ML adaptativas e automatizadas na plataforma InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Links<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">O artigo 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\">Exemplos do Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/Convergent-Analytics\">An\u00e1lise Convergente<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bit<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">Documenta\u00e7\u00e3o e cursos de Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>O grupo de usu\u00e1rios do MLToolkit \u00e9 um reposit\u00f3rio privado do GitHub, criado como parte da organiza\u00e7\u00e3o corporativa do GitHub InterSystems. Ele \u00e9 destinado a usu\u00e1rios externos que instalam, estudam ou j\u00e1 utilizam componentes do MLToolkit, incluindo o Python Gateway. O grupo disponibiliza uma s\u00e9rie de casos implementados (com c\u00f3digo-fonte e dados de teste) nas \u00e1reas de marketing, produ\u00e7\u00e3o, medicina e muitas outras ind\u00fastrias. Para se juntar ao grupo de usu\u00e1rios do ML Toolkit, por favor, envie uma mensagem curta por e-mail para o seguinte endere\u00e7o: <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> e indique em seu e-mail os seguintes dados:<\/p>\n<p><\/p>\n<ul>\n<li>Nome de usu\u00e1rio do GitHub<\/li>\n<li>Organiza\u00e7\u00e3o (onde voc\u00ea trabalha ou estuda)<\/li>\n<li>Cargo (sua posi\u00e7\u00e3o real em sua organiza\u00e7\u00e3o, ou \"Estudante\", ou \"Independente\").<\/li>\n<li>Pa\u00eds<\/li>\n<\/ul>\n<p><\/p>\n<p>Para aqueles que leram o artigo e est\u00e3o interessados nas possibilidades do InterSystems IRIS como plataforma para desenvolvimento ou hospedagem de mecanismos de intelig\u00eancia artificial e aprendizado de m\u00e1quina, oferecemos a discuss\u00e3o sobre poss\u00edveis cen\u00e1rios de interesse para sua empresa. Estamos dispostos a analisar as necessidades da sua empresa e definir um plano de a\u00e7\u00e3o conjunto; o endere\u00e7o de contato do nosso grupo de especialistas em AI\/ML \u00e9 <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Fonte: <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.3 - 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\/pt\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 no InterSystems IRIS | ProHoster","description":"Este artigo \u00e9 dedicado ao Python Gateway \u2014 um projeto comunit\u00e1rio de c\u00f3digo aberto para a plataforma de dados InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}