{"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\/fr\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway dans InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cet article est consacr\u00e9 \u00e0 Python Gateway, un projet communautaire open source pour la plateforme de donn\u00e9es InterSystems IRIS. Ce projet permet d'orchestrer n'importe quel algorithme d'apprentissage automatique d\u00e9velopp\u00e9 en Python (la principale plateforme pour de nombreux Data Scientists), d'utiliser de nombreuses biblioth\u00e8ques pr\u00eates \u00e0 l'emploi pour cr\u00e9er rapidement des solutions analytiques AI\/ML adaptatives et robotis\u00e9es sur la plateforme InterSystems IRIS. Dans cet article, je vais montrer comment InterSystems IRIS peut orchestrer des processus en Python, effectuer une transmission bidirectionnelle des donn\u00e9es et cr\u00e9er des processus commerciaux intelligents.<\/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>Introduction.<\/li>\n<li>Outils.<\/li>\n<li>Installation.<\/li>\n<li>API.<\/li>\n<li>Interop\u00e9rabilit\u00e9.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Conclusions.<\/li>\n<li>Liens.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introduction<\/h1>\n<p><\/p>\n<p>Python est un langage de programmation de haut niveau et g\u00e9n\u00e9raliste, ax\u00e9 sur l'am\u00e9lioration de la productivit\u00e9 du d\u00e9veloppeur et la lisibilit\u00e9 du code. Dans cette s\u00e9rie d'articles, je vais parler des possibilit\u00e9s d'application du langage Python sur la plateforme InterSystems IRIS, l'accent de cet article \u00e9tant mis sur l'utilisation de Python comme langue de cr\u00e9ation et d'application de mod\u00e8les d'apprentissage automatique.<\/p>\n<p><\/p>\n<p>L'apprentissage automatique (ML) est une classe de m\u00e9thodes d'intelligence artificielle, dont la caract\u00e9ristique est de ne pas r\u00e9soudre directement un probl\u00e8me, mais d'apprendre au cours de la r\u00e9solution de plusieurs probl\u00e8mes similaires. <\/p>\n<p><\/p>\n<p>Les algorithmes et mod\u00e8les d'apprentissage automatique deviennent de plus en plus r\u00e9pandus. Il y a de nombreuses raisons \u00e0 cela, mais tout se r\u00e9sume \u00e0 l'accessibilit\u00e9, \u00e0 la simplicit\u00e9 et \u00e0 l'obtention de r\u00e9sultats pratiques. La classification ou m\u00eame la mod\u00e9lisation par r\u00e9seaux de neurones est-elle une nouvelle technologie? <\/p>\n<p><\/p>\n<p>Bien s\u00fbr que non, mais \u00e0 l'heure actuelle, il n'est plus n\u00e9cessaire d'\u00e9crire des centaines de milliers de lignes de code pour ex\u00e9cuter un mod\u00e8le, et les co\u00fbts de cr\u00e9ation et d'application de mod\u00e8les diminuent de plus en plus.<\/p>\n<p><\/p>\n<p>Les outils \u00e9voluent \u2014 alors que nous n'avons pas d'outils AI\/ML enti\u00e8rement orient\u00e9s GUI, le progr\u00e8s que nous avons observ\u00e9 avec de nombreuses autres classes de syst\u00e8mes d'information, par exemple, BI (de l'\u00e9criture de code \u00e0 l'utilisation de cadres et de solutions configurables orient\u00e9es GUI), est \u00e9galement observ\u00e9 dans les outils de cr\u00e9ation AI\/ML. Nous avons d\u00e9j\u00e0 d\u00e9pass\u00e9 le stade de l'\u00e9criture de code et utilisons aujourd'hui des cadres pour construire et entra\u00eener des mod\u00e8les.<\/p>\n<p><\/p>\n<p>D'autres am\u00e9liorations, telles que la possibilit\u00e9 de d\u00e9ployer un mod\u00e8le pr\u00e9-entra\u00een\u00e9, o\u00f9 l'utilisateur final doit simplement terminer l'entra\u00eenement du mod\u00e8le sur ses donn\u00e9es sp\u00e9cifiques, facilitent \u00e9galement le d\u00e9marrage de l'application de l'apprentissage automatique. Ces avanc\u00e9es rendent l'apprentissage du machine learning beaucoup plus acessible tant pour les sp\u00e9cialistes que pour les entreprises dans leur ensemble.<\/p>\n<p><\/p>\n<p>D'un autre c\u00f4t\u00e9, nous recueillons de plus en plus de donn\u00e9es. Gr\u00e2ce \u00e0 une plateforme de donn\u00e9es unifi\u00e9e comme InterSystems IRIS, toutes ces informations peuvent \u00eatre imm\u00e9diatement pr\u00e9par\u00e9es et utilis\u00e9es comme donn\u00e9es d'entr\u00e9e pour les mod\u00e8les d'apprentissage automatique.<\/p>\n<p><\/p>\n<p>Avec le passage au cloud, le lancement de projets AI\/ML devient plus facile que jamais. Nous pouvons consommer uniquement les ressources dont nous avons besoin. De plus, gr\u00e2ce \u00e0 la parall\u00e9lisation offerte par les plateformes cloud, nous pouvons \u00e9conomiser du temps.<\/p>\n<p><\/p>\n<p>Mais qu'en est-il des r\u00e9sultats ? Ici, les choses deviennent plus complexes. Il existe de nombreux outils pour construire des mod\u00e8les, dont je parlerai plus loin. Construire un bon mod\u00e8le n'est pas facile, mais qu'en est-il ensuite ? Tirer profit de l'utilisation du mod\u00e8le par l'entreprise est \u00e9galement un d\u00e9fi non n\u00e9gligeable. Le c\u0153ur du probl\u00e8me r\u00e9side dans la s\u00e9paration des charges analytiques et transactionnelles, ainsi que des mod\u00e8les de donn\u00e9es. Lorsque nous entra\u00eenons un mod\u00e8le, nous le faisons g\u00e9n\u00e9ralement sur des donn\u00e9es historiques. Mais l'endroit o\u00f9 le mod\u00e8le doit op\u00e9rer est dans le traitement transactionnel des donn\u00e9es. Quelle utilit\u00e9 a le meilleur mod\u00e8le de d\u00e9tection des transactions frauduleuses si nous ne l'ex\u00e9cutons qu'une fois par jour ? Les fraudeurs sont d\u00e9j\u00e0 partis avec l'argent. Nous devons entra\u00eener le mod\u00e8le sur des donn\u00e9es historiques, mais nous devons aussi l'appliquer en temps r\u00e9el sur les nouvelles donn\u00e9es entrantes afin que nos processus d'affaires puissent agir en fonction des pr\u00e9visions faites par le mod\u00e8le.<\/p>\n<p><\/p>\n<p>Le ML Toolkit est un ensemble d'outils dont l'objectif est pr\u00e9cis\u00e9ment cela : r\u00e9unir les mod\u00e8les et l'environnement transactionnel, afin que les mod\u00e8les construits puissent \u00eatre facilement utilis\u00e9s directement dans vos processus d'affaires. Le Python Gateway fait partie du ML Toolkit et assure l'int\u00e9gration avec le langage Python (similairement, le R Gateway, qui fait \u00e9galement partie du ML Toolkit, assure l'int\u00e9gration avec le langage R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Outils<\/h1>\n<p><\/p>\n<p>Avant de continuer, je voudrais d\u00e9crire quelques outils et biblioth\u00e8ques Python que nous utiliserons plus tard.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Technologies<\/h2>\n<p><\/p>\n<ul>\n<li>Python est un langage de programmation interpr\u00e9t\u00e9 de haut niveau \u00e0 usage g\u00e9n\u00e9ral. L'un des principaux avantages de ce langage est sa vaste biblioth\u00e8que de biblioth\u00e8ques math\u00e9matiques, ML et AI. \u00c0 l'instar d'ObjectScript, c'est un langage orient\u00e9 objet, mais tout est d\u00e9fini dynamiquement, et non statiquement. Tout est \u00e9galement un objet. Les articles ult\u00e9rieurs supposeront une familiarit\u00e9 superficielle avec le langage. Si vous souhaitez commencer \u00e0 apprendre, je vous recommande de commencer par <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">documentation<\/a><\/noindex>.<\/li>\n<li>Pour nos exercices suivants, installez <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bits<\/a><\/noindex>.<\/li>\n<li>IDE : J'utilise <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, mais en g\u00e9n\u00e9ral, il y en a <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">beaucoup<\/a><\/noindex>. Si vous utilisez Atelier, il existe un plugin Eclipse pour les d\u00e9veloppeurs Python. Si vous utilisez VS Code, il existe une extension pour Python. <\/li>\n<li>Notebook : au lieu d'un IDE, vous pouvez \u00e9crire et partager vos scripts dans des notebooks en ligne. Le plus populaire d'entre eux est <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Biblioth\u00e8ques<\/h2>\n<p><\/p>\n<p>Voici une liste (non exhaustive) de biblioth\u00e8ques pour l'apprentissage automatique :<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 un paquet fondamental pour les calculs num\u00e9riques.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 des structures de donn\u00e9es \u00e0 haute performance et des outils d'analyse de donn\u00e9es.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 cr\u00e9ation de graphiques.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 visualisation de donn\u00e9es bas\u00e9e sur matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 m\u00e9thodes d'apprentissage automatique.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">cuML<\/a><\/noindex> \u2014 algorithmes d'apprentissage automatique bas\u00e9s sur la m\u00e9thodologie du 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 r\u00e9seaux de neurones.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 plateforme pour cr\u00e9er des mod\u00e8les d'apprentissage automatique.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 plateforme pour cr\u00e9er des mod\u00e8les d'apprentissage automatique orient\u00e9e vers Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML \u00e0 partir de diff\u00e9rents mod\u00e8les.<\/li>\n<\/ul>\n<p><\/p>\n<p>Les technologies AI\/ML permettent de rendre les entreprises plus efficaces et adaptables. De plus, aujourd'hui, ces technologies deviennent plus faciles \u00e0 d\u00e9velopper et \u00e0 mettre en \u0153uvre. Commencez \u00e0 \u00e9tudier les technologies AI\/ML et comment elles peuvent aider votre organisation \u00e0 cro\u00eetre.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Installation<\/h1>\n<p><\/p>\n<p>Il existe plusieurs fa\u00e7ons d'installer et d'utiliser Python Gateway :<\/p>\n<p><\/p>\n<ul>\n<li>OS\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>Utilisez l'image de DockerHub<\/li>\n<li>Cr\u00e9ez votre propre image<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Peu importe la m\u00e9thode d'installation, vous aurez besoin du code source. Le seul endroit pour t\u00e9l\u00e9charger le code est <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">la page des versions<\/a><\/noindex>. Elle contient des versions stables test\u00e9es, il suffit de prendre la plus r\u00e9cente. Actuellement, c'est 0.8, mais de nouvelles versions viendront avec le temps. Ne clonez pas\/t\u00e9l\u00e9chargez pas le d\u00e9p\u00f4t, t\u00e9l\u00e9chargez la derni\u00e8re version.<\/p>\n<p><\/p>\n<h2 id=\"os\">OS<\/h2>\n<p><\/p>\n<p>Si vous installez le Python Gateway sur un syst\u00e8me d'exploitation, il est d'abord n\u00e9cessaire d'installer Python, quel que soit le syst\u00e8me d'exploitation.<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Installer Python 3.6.7 64 bits<\/a><\/noindex>. Il est recommand\u00e9 d'installer Python dans le r\u00e9pertoire par d\u00e9faut.<\/li>\n<li>Installez le module <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>T\u00e9l\u00e9chargez le code ObjectScript (c'est-\u00e0-dire <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\", , 1)<\/code>) dans n'importe quelle zone avec des produits. Si vous souhaitez qu'une zone existante prenne en charge les produits, ex\u00e9cutez : <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Placez <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> dans le dossier <code>bin<\/code> de votre instance InterSystems IRIS. Le fichier de biblioth\u00e8que doit \u00eatre accessible au chemin retourn\u00e9 par <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>Assurez-vous que la variable d'environnement <code>PYTHONHOME<\/code> pointe vers Python 3.6.7.<\/li>\n<li>Assurez-vous que la variable d'environnement syst\u00e8me <code>PATH<\/code> contient la variable <code>PYTHONHOME<\/code> (ou le r\u00e9pertoire auquel elle pointe).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>V\u00e9rifiez que la variable d'environnement <code>PATH<\/code> contient <code>\/usr\/lib<\/code> et <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Utilisez le fichier <code>\/etc\/environment<\/code> pour configurer les variables d'environnement.<\/li>\n<li>En cas d'erreurs <code>undefined symbol: _Py_TrueStruct<\/code> d\u00e9finissez la configuration <code>PythonLib<\/code>. De plus, dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> il y a une section D\u00e9pannage.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Actuellement, seule la version Python 3.6.7 est prise en charge \u00e0 partir de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. V\u00e9rifiez la variable <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Si vous avez modifi\u00e9 les variables d'environnement, red\u00e9marrez votre produit InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>L'utilisation de conteneurs pr\u00e9sente plusieurs avantages : <\/p>\n<p><\/p>\n<ul>\n<li>Portabilit\u00e9<\/li>\n<li>Efficacit\u00e9<\/li>\n<li>Isolation<\/li>\n<li>L\u00e9g\u00e8ret\u00e9<\/li>\n<li>Immutabilit\u00e9<\/li>\n<\/ul>\n<p><\/p>\n<p>Consultez cette <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">s\u00e9rie d'articles<\/a><\/noindex> pour des informations plus d\u00e9taill\u00e9es sur l'utilisation de Docker avec les produits InterSystems. <\/p>\n<p><\/p>\n<p>Tous les builds du Python Gateway sont actuellement bas\u00e9s sur des conteneurs <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Image pr\u00eate<\/h3>\n<p><\/p>\n<p>Ex\u00e9cutez : <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, pour t\u00e9l\u00e9charger et ex\u00e9cuter le Python Gateway avec l'\u00e9dition communautaire d'InterSystems IRIS. C'est tout.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Cr\u00e9ez votre propre image<\/h3>\n<p><\/p>\n<p>Pour construire l'image Docker, ex\u00e9cutez \u00e0 la racine du d\u00e9p\u00f4t : <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nPar d\u00e9faut, l'image est construite \u00e0 partir de l'image <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, mais vous pouvez modifier cela en d\u00e9finissant la variable <code>IMAGE<\/code>.<br \/>\nPour assembler depuis InterSystems IRIS, ex\u00e9cutez : `docker build --build-arg IMAGE=store\/intersystems\/iris:2019.4.0.383.0 --force-rm --tag intersystemscommunity\/irispy:latest &lt;.<\/p>\n<p><\/p>\n<p>Apr\u00e8s cela, vous pouvez ex\u00e9cuter l'image 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 vous utilisez une image bas\u00e9e sur l'\u00e9dition communautaire d'InterSystems IRIS, vous n'avez pas besoin de sp\u00e9cifier de cl\u00e9.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Commentaires<\/h3>\n<p><\/p>\n<ul>\n<li>Processus de test <code>isc.py.test.Process<\/code> sauvegarde une s\u00e9rie d'images dans un r\u00e9pertoire temporaire. Vous voudrez peut-\u00eatre modifier ce chemin vers un r\u00e9pertoire mont\u00e9. Pour ce faire, \u00e9ditez le param\u00e8tre <code>WorkingDir<\/code> en sp\u00e9cifiant le r\u00e9pertoire mont\u00e9.<\/li>\n<li>Pour acc\u00e9der au terminal, ex\u00e9cutez : <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Acc\u00e8s au Portail de Gestion du Syst\u00e8me avec le login <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Pour arr\u00eater le conteneur, ex\u00e9cutez : <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">V\u00e9rification de l'installation<\/h2>\n<p><\/p>\n<p>Apr\u00e8s avoir install\u00e9 le Python Gateway, v\u00e9rifiez qu'il fonctionne. Ex\u00e9cutez ce code dans le 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>Cela devrait afficher <code>HELLO<\/code> \u2014 la valeur de la variable Python <code>x<\/code>. Si le statut retourn\u00e9 <code>sc<\/code> est une erreur ou <code>var<\/code> vide, v\u00e9rifiez <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 section D\u00e9pannage<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway est install\u00e9, et vous avez v\u00e9rifi\u00e9 qu'il fonctionne. Il est temps de commencer \u00e0 l'utiliser !<br \/>\nL'interface principale de Python est <code>isc.py.Main<\/code>. Il propose les groupes de m\u00e9thodes suivants (toutes retournent <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Ex\u00e9cution du code<\/li>\n<li>Transmission de donn\u00e9es<\/li>\n<li>M\u00e9thodes auxiliaires<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Ex\u00e9cution du code<\/h2>\n<p><\/p>\n<p>Ces m\u00e9thodes permettent d'ex\u00e9cuter du code Python arbitraire.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 c'est la m\u00e9thode principale. Elle accepte 4 arguments optionnels :<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 une cha\u00eene de code \u00e0 ex\u00e9cuter. Le caract\u00e8re de nouvelle ligne : <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 le nom de la variable \u00e0 retourner.<\/li>\n<li><code>serialization<\/code> \u2014 comment s\u00e9rialiser. <code>returnVariable<\/code>. 0 \u2014 cha\u00eene (par d\u00e9faut), 1 \u2014 repr.<\/li>\n<li><code>result<\/code> \u2014 ByRef r\u00e9f\u00e9rence \u00e0 la variable dans laquelle la valeur est \u00e9crite <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nous avons pr\u00e9c\u00e9demment ex\u00e9cut\u00e9 :<\/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>Dans cet exemple, nous attribuons \u00e0 la variable Python <code>x<\/code> la valeur <code>Bonjour<\/code> et voulons retourner la valeur de la variable Python <code>x<\/code> dans une variable ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode est une alternative plus s\u00fbre et moins restrictive <code>SimpleString<\/code>.<br \/>\nLes cha\u00eenes dans la plateforme InterSystems IRIS sont limit\u00e9es \u00e0 3 641 144 caract\u00e8res, et si vous souhaitez ex\u00e9cuter un morceau de code plus long, vous devez utiliser des workflows.<br \/>\nDeux arguments sont accept\u00e9s :<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 une cha\u00eene ou un flux de code Python \u00e0 ex\u00e9cuter.<\/li>\n<li><code>variable<\/code> \u2014 (optionnel) attribue le r\u00e9sultat de l'ex\u00e9cution <code>code<\/code> \u00e0 cette variable Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemple d'utilisation :<\/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>Dans cet exemple, nous multiplions 2 par 3 et enregistrons le r\u00e9sultat dans la variable Python <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Transmission de donn\u00e9es<\/h2>\n<p><\/p>\n<p>Transf\u00e9rez des donn\u00e9es entre Python et InterSystems IRIS.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Il existe 4 fa\u00e7ons d'obtenir la valeur d'une variable Python dans InterSystems IRIS, selon la s\u00e9rialisation dont vous avez besoin :<\/p>\n<p><\/p>\n<ul>\n<li><code>Cha\u00eene<\/code> pour les types de donn\u00e9es simples et le d\u00e9bogage.<\/li>\n<li><code>Repr<\/code> pour le stockage d'objets simples et le d\u00e9bogage.<\/li>\n<li><code>JSON<\/code> pour manipuler facilement les donn\u00e9es c\u00f4t\u00e9 InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> pour la sauvegarde d'objets.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ces m\u00e9thodes permettent d'obtenir des variables Python sous forme de cha\u00eenes ou de flux.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 obtenir <code>serialization<\/code> variable <code>variable<\/code> dans <code>stream<\/code>. Si <code>useString<\/code> \u00e9gal \u00e0 1 et la s\u00e9rialisation est plac\u00e9e dans une cha\u00eene, donc renvoie une cha\u00eene et non un flux.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 obtenir la s\u00e9rialisation JSON de la variable.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 obtenir la s\u00e9rialisation Pickle (ou Dill) de la variable.<\/li>\n<\/ul>\n<p><\/p>\n<p>Essayons d'obtenir notre 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>Nous chargeons des donn\u00e9es d'InterSystems IRIS dans Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 cr\u00e9e un ensemble de donn\u00e9es (pandas <code>dataframe<\/code> ou <code>list<\/code>) d'une requ\u00eate SQL et l'assigne \u00e0 une variable Python. <code>variable<\/code>. Le package <code>isc.py<\/code> doit \u00eatre disponible dans la zone <code>namespace<\/code> \u2014 o\u00f9 la requ\u00eate sera ex\u00e9cut\u00e9e.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 charge les donn\u00e9es d'un global <code>global<\/code> d'un sous-script <code>start<\/code> \u00e0 <code>end<\/code> dans Python comme une variable de type <code>type<\/code>: <code>list<\/code>, ou pandas. <code>dataframe<\/code>. La description des arguments optionnels <code>masquer<\/code> and <code>labels<\/code> est disponible dans la documentation de la classe et le d\u00e9p\u00f4t <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 charge les donn\u00e9es d'une classe <code>class<\/code> d'un id <code>start<\/code> \u00e0 <code>end<\/code> dans Python comme une variable de type <code>type<\/code>: <code>list<\/code>, ou pandas. <code>dataframe<\/code>. <code>properties<\/code> \u2014 liste (s\u00e9parateur : virgule) des propri\u00e9t\u00e9s de classe \u00e0 charger dans l'ensemble de donn\u00e9es. Les masques sont support\u00e9s. <code>*<\/code> et <code>?<\/code>. Par d\u00e9faut \u2014 <code>*<\/code> (toutes les propri\u00e9t\u00e9s). La propri\u00e9t\u00e9 <code>%%CLASSNAME<\/code> est ignor\u00e9e.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 charge les donn\u00e9es d'une table <code>table<\/code> d'un id <code>start<\/code> \u00e0 <code>end<\/code> dans Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 est universel (toute requ\u00eate SQL valide sera transmise \u00e0 Python). Cependant, <code>ExecuteGlobal<\/code> et ses enveloppes <code>ExecuteClass<\/code> et <code>ExecuteTable<\/code> ont des limitations. Ils sont beaucoup plus rapides (3 \u00e0 5 fois plus rapides que le pilote ODBC et 20 fois plus rapides <code>ExecuteQuery<\/code>). Plus d'informations dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<br \/>\nToutes ces m\u00e9thodes supportent le transfert de donn\u00e9es depuis n'importe quelle zone. Le package <code>isc.py<\/code> doit \u00eatre accessible dans la zone cible.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 transmission des r\u00e9sultats de toute requ\u00eate SQL valide vers Python. C'est la m\u00e9thode la plus lente pour transf\u00e9rer des donn\u00e9es. Utilisez-la si <code>ExecuteGlobal<\/code> et ses enveloppes ne sont pas disponibles.<\/p>\n<p><\/p>\n<p>Arguments :<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 requ\u00eate SQL.<\/li>\n<li><code>variable<\/code> \u2014 nom de la variable Python dans laquelle les donn\u00e9es sont \u00e9crites.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> ou Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 zone dans laquelle la requ\u00eate sera ex\u00e9cut\u00e9e.<\/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 transmission d'un global vers Python.<\/p>\n<p><\/p>\n<p>Arguments :<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 nom du global sans <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 nom de la variable Python dans laquelle les donn\u00e9es sont \u00e9crites.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> ou Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 premier sous-script du global. Obligatoire <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 dernier sous-script du global. Obligatoire. <code>%Integer<\/code>.<\/li>\n<li><code>masquer<\/code> \u2014 masque de valeurs de la variable globale. La masque peut \u00eatre plus courte que le nombre de champs dans la variable globale (dans ce cas, les champs \u00e0 la fin seront ignor\u00e9s). Comment formater le masque :\n<ul>\n<li><code>+<\/code> transf\u00e9rer la valeur telle quelle.<\/li>\n<li><code>-<\/code> ignorer la valeur.<\/li>\n<li><code>b<\/code> \u2014 Type logique (<code>0<\/code> \u2014 <code>False<\/code>, tout le reste \u2014 <code>Vrai<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Date (\u00e0 partir de $horolog, sous Windows depuis 1970, sous Linux depuis 1900).<\/li>\n<li><code>t<\/code> \u2014 Heure ($horolog, secondes apr\u00e8s minuit).<\/li>\n<li><code>m<\/code> \u2014 Horodatage (cha\u00eene au format ANN\u00c9E-MOIS-JOUR HEURE:MINUTE:SECONDE).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Liste des noms de colonnes. Le premier \u00e9l\u00e9ment \u2014 le nom du sous-script.<\/li>\n<li><code>namespace<\/code> \u2014 zone dans laquelle la requ\u00eate sera ex\u00e9cut\u00e9e.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Enveloppe sur <code>ExecuteGlobal<\/code>. Pr\u00e9pare l'appel bas\u00e9 sur la d\u00e9finition de la classe <code>ExecuteGlobal<\/code> et l'appelle.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 passage de donn\u00e9es de classe en Python.<\/p>\n<p><\/p>\n<p>Arguments :<\/p>\n<p><\/p>\n<ul>\n<li><code>class<\/code> \u2014 nom de la classe<\/li>\n<li><code>variable<\/code> \u2014 nom de la variable Python dans laquelle les donn\u00e9es sont \u00e9crites.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> ou Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 Id de d\u00e9part.<\/li>\n<li><code>end<\/code> \u2014 Id de fin<\/li>\n<li><code>properties<\/code> \u2014 liste (s\u00e9parateur : virgule) des propri\u00e9t\u00e9s de classe \u00e0 charger dans l'ensemble de donn\u00e9es. Les masques sont support\u00e9s. <code>*<\/code> et <code>?<\/code>. Par d\u00e9faut \u2014 <code>*<\/code> (toutes les propri\u00e9t\u00e9s). La propri\u00e9t\u00e9 <code>%%CLASSNAME<\/code> est ignor\u00e9e.<\/li>\n<li><code>namespace<\/code> \u2014 zone dans laquelle la requ\u00eate sera ex\u00e9cut\u00e9e.<\/li>\n<\/ul>\n<p><\/p>\n<p>Toutes les propri\u00e9t\u00e9s sont transf\u00e9r\u00e9es telles quelles, sauf les propri\u00e9t\u00e9s des types <code>te<\/code>, <code>%Heure<\/code>, <code>%Bool\u00e9en<\/code> et <code>%Horodatage<\/code> \u2014 elles sont converties en classes Python correspondantes.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Enveloppe sur <code>ExecuteClass<\/code>. Transmet le nom de la table au nom de la classe et l'appelle <code>ExecuteClass<\/code>. Signature :<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 passage de donn\u00e9es de table en Python.<\/p>\n<p><\/p>\n<p>Arguments :<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 nom de la table.<br \/>\nTous les autres arguments sont pass\u00e9s tels quels dans <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Remarques<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> et <code>ExecuteTable<\/code> fonctionnent aussi vite.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 fois plus vite que <code>ExecuteQuery<\/code> sur de grands ensembles de donn\u00e9es (temps de transfert sup\u00e9rieur \u00e0 &gt;0.01 seconde).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> et <code>ExecuteTable<\/code> fonctionnent sur des variables globales avec cette structure : <code>^global(clef) = $lb(prop1, prop2, ..., propN)<\/code> o\u00f9 <code>key<\/code> \u2014 entier.<\/li>\n<li>Pour <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> et <code>ExecuteTable<\/code> plage de valeurs accept\u00e9es <code>te<\/code> correspond \u00e0 la plage <code>mktime<\/code> et d\u00e9pend du syst\u00e8me d'exploitation (<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>). Utilisez <code>%Horodatage<\/code>pour transf\u00e9rer des donn\u00e9es en dehors de cette plage ou utilisez un dataframe pandas car cette limitation ne s'applique qu'\u00e0 la liste.<\/li>\n<li>Pour <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> et <code>ExecuteTable<\/code> tous les arguments \u00e0 l'exception de la source de donn\u00e9es (variable globale, classe ou table) et la variable sont optionnels.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Exemples<\/h2>\n<p><\/p>\n<p>Classe de test <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> contient une m\u00e9thode d\u00e9montrant toutes les variantes de passage de donn\u00e9es :<\/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\/\/ Arguments g\u00e9n\u00e9raux\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ M\u00e9thode 0 : ExecuteGlobal sans arguments\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ M\u00e9thode 1 : ExecuteGlobal avec arguments    \n\/\/ Lors de la transmission du global, les noms de champs sont d\u00e9finis manuellement\n\/\/ globalKey - nom de la sous-cl\u00e9 \nset labels = $lb(\"globalKey\", \"Name\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask contient 1 \u00e9l\u00e9ment de moins que labels car \"globalKey\" - nom de la sous-cl\u00e9\n\/\/ Nous omettons %%CLASSNAME\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ M\u00e9thode 2 : ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ M\u00e9thode 3 : ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ M\u00e9thode 4 : ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Appelez la m\u00e9thode <code>do ##class(isc.py.test.Person).Test()<\/code> pour voir comment fonctionnent toutes les m\u00e9thodes de transmission de donn\u00e9es.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">M\u00e9thodes d'assistance<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 obtenir des informations sur la variable : si elle est d\u00e9finie, la classe et la longueur de la s\u00e9rialisation.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 la variable est-elle d\u00e9finie.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 obtenir la classe de la variable.<\/li>\n<li><code>GetStatus()<\/code> \u2014 obtenir et supprimer la derni\u00e8re exception c\u00f4t\u00e9 Python.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 obtenir la variable du module et le statut d'importation.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 obtenir des informations sur la fonction.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interop\u00e9rabilit\u00e9<\/h1>\n<p><\/p>\n<p>Vous avez appris \u00e0 appeler Python Gateway depuis le terminal, maintenant commen\u00e7ons \u00e0 l'utiliser en production. La base de l'interaction avec Python dans ce mode est \u2014 <code>isc.py.ens.Operation<\/code>. Il nous permet de :<\/p>\n<p><\/p>\n<ul>\n<li>Ex\u00e9cuter du code Python<\/li>\n<li>Sauvegarder\/R\u00e9cup\u00e9rer le contexte Python<\/li>\n<li>Charger et obtenir des donn\u00e9es de Python<\/li>\n<\/ul>\n<p><\/p>\n<p>En principe, l'op\u00e9ration Pyhton est un wrapper autour de <code>isc.py.Main<\/code>. L'op\u00e9ration <code>isc.py.ens.Operation<\/code> permet d'interagir avec le processus Python depuis les productions InterSystems IRIS. Cinq types de requ\u00eates sont support\u00e9s :<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> pour ex\u00e9cuter le code Python. Renvoie <code>isc.py.msg.ExecutionResponse<\/code> avec le r\u00e9sultat de l'ex\u00e9cution et les valeurs des variables demand\u00e9es.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> pour ex\u00e9cuter le code Python. Renvoie <code>isc.py.msg.StreamExecutionResponse<\/code> avec le r\u00e9sultat de l'ex\u00e9cution et les valeurs des variables demand\u00e9es. Semblable \u00e0 <code>isc.py.msg.ExecutionRequest<\/code>, mais accepte et renvoie des flux au lieu de cha\u00eenes.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> pour transmettre le r\u00e9sultat de l'ex\u00e9cution de la requ\u00eate SQL. Renvoie <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> pour transmettre des donn\u00e9es de global\/classe\/table. Renvoie <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> pour sauvegarder le contexte Python. Renvoie <code>Ens.StringResponse<\/code> avec l'identifiant de contexte.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> pour restaurer le contexte Python.<\/p>\n<p><\/p>\n<p>De plus, <code>isc.py.ens.Operation<\/code> a deux param\u00e8tres :<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 choix de la classe impl\u00e9mentant l'interface <code>isc.py.init.Abstract<\/code>. Il peut \u00eatre utilis\u00e9 pour charger des fonctions, des modules, des classes, etc. Il s'ex\u00e9cute une seule fois au d\u00e9marrage du processus.<\/li>\n<li><code>PythonLib<\/code> \u2014 (uniquement pour Linux) si vous voyez des erreurs lors du chargement, d\u00e9finissez sa valeur \u00e0 <code>libpython3.6m.so<\/code> ou m\u00eame au chemin complet de la biblioth\u00e8que Python. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Cr\u00e9ation de processus m\u00e9tier<\/h2>\n<p><\/p>\n<p>Deux classes sont disponibles pour faciliter le d\u00e9veloppement des processus m\u00e9tier :<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> permet d'extraire des annotations des activit\u00e9s avec substitution de variables.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> facilite le test des processus m\u00e9tier avec Python. Il peut ex\u00e9cuter un processus m\u00e9tier (parties en langage Python) dans le processus actuel.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Substitution de variables<\/h2>\n<p><\/p>\n<p>Tous les processus m\u00e9tier h\u00e9rit\u00e9s de <code>isc.py.ens.ProcessUtils<\/code>, peuvent utiliser la m\u00e9thode <code>GetAnnotation(name)<\/code> pour obtenir la valeur de l'annotation d'une activit\u00e9 par son nom. L'annotation d'activit\u00e9 peut contenir des variables, qui seront calcul\u00e9es c\u00f4t\u00e9 InterSystems IRIS avant d'\u00eatre transmises \u00e0 Python. Voici la syntaxe de substitution de variables :<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 appel de m\u00e9thode<\/li>\n<li><code>#{expr}<\/code> \u2014 ex\u00e9cuter du code en ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Un exemple est disponible dans le processus m\u00e9tier de test <code>isc.py.test.Process<\/code>, par exemple, dans l'activit\u00e9 <code>Matrice de Corr\u00e9lation : Graphique<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. Dans cet exemple :<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> renvoie la propri\u00e9t\u00e9 WorkDirectory de l'objet <code>process<\/code>, qui est une instance de la classe <code>isc.py.test.Process<\/code> c'est-\u00e0-dire le processus m\u00e9tier actuel.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> est cliqu\u00e9, cela appelle la m\u00e9thode <code>Entier<\/code> classe <code>%PopulateUtils<\/code>, en passant les arguments <code>1<\/code> et <code>100<\/code>, renvoyant un entier al\u00e9atoire dans la plage <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Processus m\u00e9tier de test<\/h2>\n<p><\/p>\n<p>Le produit de test et le processus m\u00e9tier de test sont disponibles par d\u00e9faut dans le cadre du Python Gateway. Pour les utiliser :<\/p>\n<p><\/p>\n<ol>\n<li>Ex\u00e9cutez dans le terminal de l'OS : <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>Dans le terminal InterSystems IRIS, ex\u00e9cutez : <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> pour remplir les donn\u00e9es de test.<\/li>\n<li>Lancez le produit <code>isc.py.test.Production<\/code>.<\/li>\n<li>Envoyer une requ\u00eate de type <code>Ens.Request<\/code> dans <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Voyons comment tout cela fonctionne ensemble. Ouvrez <code>isc.py.test.Process<\/code> dans l'\u00e9diteur BPL :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans 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\">Ex\u00e9cution du code<\/h3>\n<p><\/p>\n<p>L'appel le plus important \u2014 ex\u00e9cution du code Python :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Utilis\u00e9 une requ\u00eate <code>isc.py.msg.ExecutionRequest<\/code>, voici ses propri\u00e9t\u00e9s :<\/p>\n<p><\/p>\n<ul>\n<li><code>Code<\/code> \u2014 le code Python.<\/li>\n<li><code>SeparateLines<\/code> \u2014 s\u00e9parer le code en lignes pour ex\u00e9cution. <code>$c(10)<\/code> (<code>n<\/code>) est utilis\u00e9 pour s\u00e9parer les lignes. Notez qu'il n'est PAS recommand\u00e9 de traiter le message dans son ensemble, cette fonction est uniquement destin\u00e9e \u00e0 traiter <code>def<\/code> et autres expressions multi-lignes. Par d\u00e9faut, <code>0<\/code>.<\/li>\n<li><code>Variables<\/code> \u2014 une liste de variables s\u00e9par\u00e9es par des virgules qui seront ajout\u00e9es \u00e0 la r\u00e9ponse.<\/li>\n<li><code>S\u00e9rialisation<\/code> \u2014 Comment s\u00e9rialiser les variables que nous souhaitons retourner. Options : <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> et <code>Dill<\/code>, par d\u00e9faut <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dans notre cas, nous d\u00e9finissons simplement la propri\u00e9t\u00e9 <code>Code<\/code>, donc toutes les autres propri\u00e9t\u00e9s utilisent les valeurs par d\u00e9faut. Nous le d\u00e9finissons en appelant <code>process.GetAnnotation(\"Import pandas\")<\/code>, qui, \u00e0 l'ex\u00e9cution, renvoie l'annotation apr\u00e8s avoir effectu\u00e9 le remplacement des variables. Au final, le code <code>import pandas as pd<\/code> sera transmis \u00e0 Python. <code>GetAnnotation<\/code> peut \u00eatre utile pour obtenir des scripts Python multi-lignes, mais il n'y a aucune restriction sur ce moyen d'obtenir le code. Vous pouvez d\u00e9finir la propri\u00e9t\u00e9 <code>Code<\/code> de n'importe quelle mani\u00e8re qui vous convient.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Obtention des variables<\/h3>\n<p><\/p>\n<p>Un autre appel int\u00e9ressant utilisant <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Matrice de Corr\u00e9lation : Tabulaire<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il calcule la Matrice de Corr\u00e9lation c\u00f4t\u00e9 Python et extrait la variable <code>corrmat<\/code> en retour dans InterSystems IRIS au format JSON, en d\u00e9finissant les propri\u00e9t\u00e9s de la requ\u00eate :<\/p>\n<p><\/p>\n<ul>\n<li><code>Variables<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>S\u00e9rialisation<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Nous pouvons voir les r\u00e9sultats dans Visual Trace :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et si nous avons besoin de cette valeur dans le BP, nous pouvons l'obtenir ainsi : <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Transmission de donn\u00e9es<\/h3>\n<p><\/p>\n<p>Parlons maintenant du passage des donn\u00e9es d'InterSystems IRIS \u00e0 Python, toutes les requ\u00eates de passage de donn\u00e9es impl\u00e9mentent l'interface <code>isc.py.msg.DataRequest<\/code>, qui fournit les propri\u00e9t\u00e9s suivantes :<\/p>\n<p><\/p>\n<ul>\n<li><code>Variable<\/code> \u2014 la variable Python dans laquelle les donn\u00e9es sont \u00e9crites.<\/li>\n<li><code>Type<\/code> \u2014 type de variable : <code>dataframe<\/code> (dataframe pandas) ou <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 l'espace \u00e0 partir duquel nous obtenons les donn\u00e9es. Le package <code>isc.py<\/code> doit \u00eatre accessible dans cet espace. Cela peut \u00eatre un espace sans prise en charge des produits.<\/li>\n<\/ul>\n<p><\/p>\n<p>Bas\u00e9 sur cette interface, 4 classes de requ\u00eates ont \u00e9t\u00e9 impl\u00e9ment\u00e9es :<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 d\u00e9finissez la propri\u00e9t\u00e9 <code>Query<\/code> pour passer la requ\u00eate SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 d\u00e9finissez la propri\u00e9t\u00e9 <code>Classe<\/code> pour passer les donn\u00e9es de la classe.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 d\u00e9finir la propri\u00e9t\u00e9 <code>Table<\/code> pour passer les donn\u00e9es de la table.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 d\u00e9finir la propri\u00e9t\u00e9 <code>Global<\/code> pour passer les donn\u00e9es globales.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dans le processus de test, regardez l'activit\u00e9 <code>RAW<\/code>, o\u00f9 <code>isc.py.msg.QueryRequest<\/code> illustr\u00e9 en action.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans 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\">Sauvegarde\/recuperation du contexte Python<\/h3>\n<p><\/p>\n<p>Enfin, nous pouvons sauvegarder le contexte Python dans InterSystems IRIS, pour cela, nous enverrons <code>isc.py.msg.SaveRequest<\/code> avec les arguments :<\/p>\n<p><\/p>\n<ul>\n<li><code>Masque<\/code> \u2014 Seules les variables correspondant au masque sont sauvegard\u00e9es. Sont prises en charge <code>*<\/code> et <code>?<\/code>. Exemple : <code>\"Data*, Figure?\"<\/code>. Par d\u00e9faut <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Longueur maximale de la variable conserv\u00e9e. Si la s\u00e9rialisation de la variable est plus longue, elle sera ignor\u00e9e. D\u00e9finissez 0 pour accepter des variables de n'importe quelle longueur. Par d\u00e9faut <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Nom<\/code> \u2014 Nom du contexte (optionnel).<\/li>\n<li><code>Description<\/code> \u2014 Description du contexte (optionnel).<\/li>\n<\/ul>\n<p><\/p>\n<p>Retourne <code>Ens.StringResponse<\/code> avec <code>Id<\/code> du contexte enregistr\u00e9. Dans le processus de test, consultez l'activit\u00e9 <code>Save Context<\/code>.<\/p>\n<p><\/p>\n<p>La requ\u00eate correspondante <code>isc.py.msg.RestoreRequest<\/code> charge le contexte depuis InterSystems IRIS en Python :<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identifiant du contexte.<\/li>\n<li><code>Effacer<\/code> \u2014 effacer le contexte avant la restauration.<\/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 il s'agit d'une application web open source qui permet de cr\u00e9er des notebooks contenant du code, des visualisations et du texte, et de les publier. Python Gateway permet de visualiser et d'\u00e9diter les processus BPL sous forme de Jupyter Notebook. Notez qu'actuellement, l'ex\u00e9cuteur Python 3 standard est utilis\u00e9.<\/p>\n<p><\/p>\n<p>Cette extension suppose que les annotations contiennent du code Python et utilisent les noms des activit\u00e9s comme les titres pr\u00e9c\u00e9dents. Il est d\u00e9sormais possible de d\u00e9velopper des processus m\u00e9tiers PythonGateway dans Jupyter Notebook. Voici ce qui est possible : <\/p>\n<p><\/p>\n<ul>\n<li>Cr\u00e9er de nouveaux processus m\u00e9tiers<\/li>\n<li>Supprimer des processus m\u00e9tiers<\/li>\n<li>Cr\u00e9er de nouvelles activit\u00e9s<\/li>\n<li>Modifier des activit\u00e9s<\/li>\n<li>Supprimer des activit\u00e9s<\/li>\n<\/ul>\n<p><\/p>\n<p>Voici <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">vid\u00e9o de d\u00e9monstration<\/a><\/noindex>. Et quelques captures d'\u00e9cran :<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Explorateur de processus<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans 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\">\u00c9diteur de processus<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway dans 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\">Installation<\/h2>\n<p><\/p>\n<ol>\n<li>Vous aurez besoin d'InterSystems IRIS 2019.2+.<\/li>\n<li>Installez PythonGateway v0.8+ (n\u00e9cessaire uniquement <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> et <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Mettez \u00e0 jour le code ObjectScript depuis le d\u00e9p\u00f4t.<\/li>\n<li>Ex\u00e9cutez <code>do ##class(isc.py.util.Jupyter).Install()<\/code> et suivez les instructions.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Documentation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Conclusions<\/h1>\n<p><\/p>\n<p>MLToolkit est un ensemble d'outils dont l'objectif est d'int\u00e9grer les mod\u00e8les et l'environnement transactionnel, afin que les mod\u00e8les construits puissent \u00eatre facilement utilis\u00e9s directement dans vos processus m\u00e9tiers. Python Gateway fait partie de MLToolkit et facilite l'int\u00e9gration avec le langage Python, permettant d'orchestrer n'importe quel algorithme d'apprentissage automatique cr\u00e9\u00e9 en Python (l'environnement principal pour de nombreux data scientists), utilisant de nombreuses biblioth\u00e8ques pr\u00eates \u00e0 l'emploi pour cr\u00e9er rapidement des solutions analytiques adaptatives et robotis\u00e9es AI\/ML sur la plateforme InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Liens<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">L'article pr\u00e9c\u00e9dent<\/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\">Exemples de Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/Convergent-Analytics\">Convergent-Analytics<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bits<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">Documentation et cours sur Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>Le groupe d'utilisateurs de MLToolkit est un d\u00e9p\u00f4t GitHub priv\u00e9, cr\u00e9\u00e9 dans le cadre de l'organisation GitHub d'InterSystems. Il s'adresse aux utilisateurs externes qui installent, \u00e9tudient ou utilisent d\u00e9j\u00e0 des composants de MLToolkit, y compris le Python Gateway. Un certain nombre de cas d'utilisation (avec code source et donn\u00e9es de test) dans les domaines du marketing, de la production, de la m\u00e9decine et d'autres secteurs sont disponibles dans le groupe. Pour rejoindre le groupe d'utilisateurs de ML Toolkit, veuillez envoyer un court message par e-mail \u00e0 l'adresse suivante : <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> et veuillez indiquer dans votre message les informations suivantes :<\/p>\n<p><\/p>\n<ul>\n<li>Nom d'utilisateur GitHub<\/li>\n<li>Organisation (o\u00f9 vous travaillez ou \u00e9tudiez)<\/li>\n<li>Poste (votre poste r\u00e9el dans votre organisation, ou \"\u00c9tudiant\", ou \"Ind\u00e9pendant\").<\/li>\n<li>Pays<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c0 ceux qui ont lu l'article et qui sont int\u00e9ress\u00e9s par les possibilit\u00e9s d'InterSystems IRIS en tant que plateforme pour le d\u00e9veloppement ou le d\u00e9ploiement de syst\u00e8mes d'intelligence artificielle et d'apprentissage automatique, nous proposons de discuter des sc\u00e9narios pouvant int\u00e9resser votre entreprise. Nous serons heureux d'analyser les besoins de votre entreprise et de d\u00e9finir ensemble un plan d'action ; l'adresse e-mail de notre \u00e9quipe d'experts AI\/ML est - <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Source : <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.1 - 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\/fr\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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 dans InterSystems IRIS | ProHoster","description":"Cet article est d\u00e9di\u00e9 au Python Gateway \u2014 un projet communautaire open source pour la plateforme de donn\u00e9es InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}