{"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\/nl\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway in InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dit artikel is gewijd aan Python Gateway \u2014 een community-project met open source voor het InterSystems IRIS dataplatform. Dit project maakt het mogelijk om verschillende machine learning-algoritmen, ontwikkeld in Python (de belangrijkste omgeving voor veel data scientists), te orkestreren, en gebruik te maken van talloze kant-en-klare bibliotheken voor het snel cre\u00ebren van adaptieve, geautomatiseerde analytische AI\/ML-oplossingen op het InterSystems IRIS-platform. In dit artikel laat ik zien hoe InterSystems IRIS processen in Python kan orkestreren, effectief bidirectionele gegevensoverdracht kan uitvoeren en intelligente bedrijfsprocessen kan cre\u00ebren.<\/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>Inleiding.<\/li>\n<li>Toolkit.<\/li>\n<li>Installatie.<\/li>\n<li>API.<\/li>\n<li>Interoperabiliteit.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>VictoriaMetrics en Thanos pakken vergelijkbare problemen aan, maar op verschillende manieren:<\/li>\n<li>Links.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Inleiding<\/h1>\n<p><\/p>\n<p>Python is een high-level programmeertaal voor algemene doeleinden, gericht op het verbeteren van de productiviteit van de ontwikkelaar en de leesbaarheid van de code. In deze serie artikelen bespreek ik de mogelijkheden van Python op het InterSystems IRIS-platform, waarbij de focus in dit artikel ligt op het gebruik van Python als taal voor het cre\u00ebren en toepassen van machine learning-modellen.<\/p>\n<p><\/p>\n<p>Machine learning (ML) is een klasse van kunstmatige intelligentiemethoden waarbij niet direct een probleem wordt opgelost, maar waarin geleerd wordt door het oplossen van een reeks vergelijkbare problemen. <\/p>\n<p><\/p>\n<p>Machine learning-algoritmen en -modellen worden steeds vaker gebruikt. De redenen hiervoor zijn talrijk, maar alles draait om toegankelijkheid, eenvoud en het behalen van praktische resultaten. Is clustering of zelfs neuraal netwerkmodellering een nieuwe technologie? <\/p>\n<p><\/p>\n<p>Zeker niet, maar tegenwoordig is het niet meer nodig om honderden duizenden regels code te schrijven om \u00e9\u00e9n model te laten draaien, en de kosten voor het ontwikkelen en toepassen van modellen blijven dalen.<\/p>\n<p><\/p>\n<p>De tools ontwikkelen zich \u2014 terwijl we geen volledig GUI-geori\u00ebnteerde AI\/ML-tools hebben, zien we dezelfde vooruitgang zoals bij veel andere klassen informatiesystemen, bijvoorbeeld BI (van codering naar gebruik van frameworks en GUI-geori\u00ebnteerde configureerbare oplossingen), ook optreden in de tools voor het cre\u00ebren van AI\/ML. We zijn al voorbij de fase van coderen en gebruiken nu frameworks voor het bouwen en trainen van modellen.<\/p>\n<p><\/p>\n<p>Andere verbeteringen, zoals de mogelijkheid om een vooraf getraind model te verspreiden, waarbij de eindgebruiker gewoon het model verder moet trainen op zijn specifieke gegevens, vergemakkelijken ook de toepassing van machine learning. Deze vooruitgangen maken het leren van machine learning aanzienlijk eenvoudiger, zowel voor specialisten als voor bedrijven in het algemeen.<\/p>\n<p><\/p>\n<p>Aan de andere kant verzamelen we steeds meer gegevens. Dankzij een uniforme dataplatform, zoals InterSystems IRIS, kan al deze informatie onmiddellijk worden voorbereid en gebruikt als invoergegevens voor machine learning modellen.<\/p>\n<p><\/p>\n<p>Met de overgang naar de cloud wordt het lanceren van AI\/ML-projecten gemakkelijker dan ooit. We kunnen alleen de bronnen gebruiken die we nodig hebben. Bovendien kunnen we dankzij de parallelisering die cloudplatforms bieden tijd besparen.<\/p>\n<p><\/p>\n<p>Maar hoe zit het met de resultaten? Hier wordt het ingewikkelder. Er zijn veel tools voor het bouwen van modellen, waarover ik verderop zal vertellen. Een goed model bouwen is niet eenvoudig, maar wat dan? Winst halen uit het gebruik van het model door bedrijven is ook geen triviale taak. De kern van het probleem ligt in de scheiding van analytische en transactionele belasting en gegevensmodellen. Wanneer we een model trainen, doen we dat meestal op historische gegevens. Maar de plek voor het gebouwde model is in transactionele gegevensverwerking. Wat heb je aan het beste model voor het detecteren van frauduleuze transacties, als we het eens per dag draaien? Fraudeurs zijn al lang weg met het geld. We moeten het model trainen op historische gegevens, maar we moeten het ook toepassen in real-time op nieuwe binnenkomende gegevens, zodat onze bedrijfsprocessen kunnen handelen volgens de voorspellingen die door het model zijn gedaan.<\/p>\n<p><\/p>\n<p>ML Toolkit is een set tools, die specifiek is ontworpen om dit te bereiken: het combineren van modellen met de transactionele omgeving, zodat de gebouwde modellen eenvoudig in uw bedrijfsprocessen kunnen worden gebruikt. Python Gateway is een onderdeel van de ML Toolkit en biedt integratie met de programmeertaal Python (evenals R Gateway, dat als onderdeel van de ML Toolkit integratie met de taal R biedt).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Toolkit<\/h1>\n<p><\/p>\n<p>Voordat we verder gaan, wil ik een paar tools en bibliotheken voor Python beschrijven die we later gaan gebruiken.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Technologie\u00ebn<\/h2>\n<p><\/p>\n<ul>\n<li>Python is een ge\u00efnterpreteerde, high-level programmeertaal voor algemene doeleinden. Het belangrijkste voordeel van de taal is de uitgebreide bibliotheek van wiskundige, ML- en AI-bibliotheken. Net als ObjectScript is het een objectgeori\u00ebnteerde taal, maar alles wordt dynamisch en niet statisch gedefinieerd. Ook is alles een object. Latere artikelen veronderstellen een vluchtige kennismaking met de taal. Als je wilt beginnen met leren, raad ik je aan te starten met <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">de documentatie<\/a><\/noindex>.<\/li>\n<li>Installeer voor onze volgende oefeningen <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: Ik gebruik <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, maar in het algemeen zijn er <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">veel<\/a><\/noindex>. Als je Atelier gebruikt, is er een Eclipse-plugin voor Python-ontwikkelaars. Als je VS Code gebruikt, is er een extensie voor Python. <\/li>\n<li>Notebook: in plaats van een IDE kun je je scripts schrijven en delen in online notebooks. De populairste hiervan is <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Bibliotheken<\/h2>\n<p><\/p>\n<p>Hier is een (onvolledige) lijst van bibliotheken voor machine learning:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 de fundamentele pakket voor numerieke berekeningen.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 hoge prestaties datatypes en data-analyse tools.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 grafieken maken.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 datavisualisatie gebaseerd op matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 machine learning methoden.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 machine learning algoritmen binnen de gradient boosting methodologie.<\/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 neurale netwerken.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 platform voor het bouwen van machine learning modellen.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 platform voor het cre\u00ebren van machine learning modellen, gericht op Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML van verschillende modellen.<\/li>\n<\/ul>\n<p><\/p>\n<p>AI\/ML-technologie\u00ebn maken bedrijven effici\u00ebnter en flexibeler. Bovendien worden deze technologie\u00ebn vandaag de dag eenvoudiger in ontwikkeling en implementatie. Begin met het bestuderen van AI\/ML-technologie\u00ebn en hoe ze uw organisatie kunnen helpen groeien.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Installatie<\/h1>\n<p><\/p>\n<p>Er zijn verschillende manieren om de Python Gateway te installeren en te gebruiken:<\/p>\n<p><\/p>\n<ul>\n<li>het besturingssysteem\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>Gebruik een afbeelding van DockerHub<\/li>\n<li>Maak je eigen afbeelding<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Ongeacht de installatiemethode, heb je de broncode nodig. De enige plek om de code te downloaden is <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">de releasepagina<\/a><\/noindex>. Deze bevat goed geteste stabiele releases, neem gewoon de laatste. Op dit moment is dit 0.8, maar in de loop van de tijd komen er nieuwe versies. Kloneer\/ download de repository niet, download de laatste release.<\/p>\n<p><\/p>\n<h2 id=\"os\">het besturingssysteem<\/h2>\n<p><\/p>\n<p>Als u de Python Gateway op een besturingssysteem installeert, moet u eerst (ongeacht het besturingssysteem) Python installeren. Hiervoor:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Installeer Python 3.6.7 64 bit<\/a><\/noindex>. Het is aanbevolen om Python in de standaarddirectory te installeren.<\/li>\n<li>Installeer de module <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Download de ObjectScript-code (d.w.z. <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\", , 1)<\/code>) in een willekeurige namespace met producten. Als u wilt dat een bestaande namespace producten ondersteunt, voert u uit: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Plaats <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> kopi\u00ebren naar de map <code>bin<\/code> van uw InterSystems IRIS-instantie. Het bibliotheekbestand moet toegankelijk zijn via het pad dat wordt geretourneerd door <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>Zorg ervoor dat de omgevingsvariabele <code>PYTHONHOME<\/code> verwijst naar Python 3.6.7.<\/li>\n<li>Zorg ervoor dat de systeemomgevingsvariabele <code>PAD<\/code> de variabele bevat <code>PYTHONHOME<\/code> (of de directory waarop deze verwijst).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Controleer of de omgevingsvariabele <code>PAD<\/code> de afbeelding van de tekst en andere scherpe details \u2014 fijne lijnen en diagrammen \u2014 evenals contrasterende afbeeldingen. <code>\/usr\/lib<\/code> en <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Gebruik het bestand <code>\/etc\/environment<\/code> om omgevingsvariabelen in te stellen.<\/li>\n<li>In geval van fouten <code>undefined symbol: _Py_TrueStruct<\/code> stel de instelling <code>PythonLib<\/code>. Ook in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> is er een sectie Probleemoplossing.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Momenteel wordt alleen Python 3.6.7 van <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Controleer de variabele <code>PAD<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Als u omgevingsvariabelen heeft gewijzigd, start dan uw InterSystems-product opnieuw op.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>Het gebruik van containers heeft verschillende voordelen: <\/p>\n<p><\/p>\n<ul>\n<li>Haalbaarheid<\/li>\n<li>Effici\u00ebntie<\/li>\n<li>Isolatie<\/li>\n<li>Lichtgewicht<\/li>\n<li>Immutabiliteit<\/li>\n<\/ul>\n<p><\/p>\n<p>Neem contact op met deze <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">serie artikelen<\/a><\/noindex> voor meer gedetailleerde informatie over het gebruik van Docker met InterSystems-producten. <\/p>\n<p><\/p>\n<p>Alle builds van Python Gateway zijn momenteel gebaseerd op containers. <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Klaar beeld<\/h3>\n<p><\/p>\n<p>Voer uit: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, om de Python Gateway met InterSystems IRIS Community Edition te downloaden en te starten. Dat is alles.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Maak je eigen afbeelding<\/h3>\n<p><\/p>\n<p>Om het docker-image te bouwen, voert u het volgende uit in de hoofdmap van de repository: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nStandaard wordt het image gebouwd op basis van het image <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, maar u kunt dit wijzigen door de variabele <code>IMAGE<\/code>.<br \/>\nVoer uit voor het bouwen uit InterSystems IRIS: `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>Daarna kunt u het docker-image starten:<\/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>Als u een image gebruikt die is gebaseerd op InterSystems IRIS Community Edition, hoeft u de sleutel mogelijk niet op te geven.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Opmerkingen<\/h3>\n<p><\/p>\n<ul>\n<li>Testproces <code>isc.py.test.Process<\/code> Bewaar een reeks afbeeldingen in de tijdelijke map. Mogelijk wilt u dit pad wijzigen naar een gemonteerde map. Om dit te doen, bewerk de instelling <code>WorkingDir<\/code> door de gemonteerde directory op te geven.<\/li>\n<li>Om toegang te krijgen tot de terminal, voer uit: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Toegang tot het Systeem Beheerportaal via inloggen <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Om de container te stoppen, voer uit: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Controleer de installatie<\/h2>\n<p><\/p>\n<p>Nadat u de Python Gateway hebt ge\u00efnstalleerd, is het goed om te controleren of deze werkt. Voer deze code in de terminal van InterSystems IRIS uit:<\/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>Het resultaat moet zijn <code>HELLO<\/code> \u2014 de waarde van de Python-variabele <code>x<\/code>. Als de teruggegeven status <code>sc<\/code> een fout is of <code>var<\/code> leeg is, controleer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 Probleemoplossingssectie<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway is ge\u00efnstalleerd en u heeft gecontroleerd dat deze werkt. Het is tijd om ermee aan de slag te gaan!<br \/>\nDe belangrijkste interface naar Python is <code>isc.py.Main<\/code>. Deze biedt de volgende groepen methoden (alle retourneren <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Code uitvoeren<\/li>\n<li>Gegevensoverdracht<\/li>\n<li>Hulpmiddelen<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Code uitvoeren<\/h2>\n<p><\/p>\n<p>Deze methoden stellen u in staat willekeurige Python-code uit te voeren.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 is de belangrijkste methode. Het accepteert 4 optionele argumenten:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 de code string die moet worden uitgevoerd. Nieuwe regel teken: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 de naam van de variabele voor terug te geven.<\/li>\n<li><code>serialisatie<\/code> \u2014 hoe te serialiseren. <code>returnVariable<\/code>. 0 \u2014 string (standaard), 1 \u2014 repr.<\/li>\n<li><code>resultaat<\/code> \u2014 ByRef gezegd naar de variabele waarin de waarde wordt geschreven. <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Hierboven hebben we uitgevoerd:<\/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>In dit voorbeeld wijzen we de Python-variabele toe <code>x<\/code> de waarde <code>Hallo<\/code> en willen we de waarde van de Python-variabele teruggeven <code>x<\/code> aan de ObjectScript-variabele. <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode is een veiligere en minder beperkte alternatieve optie. <code>SimpleString<\/code>.<br \/>\nStrings in het InterSystems IRIS-platform zijn beperkt tot 3.641.144 tekens, en als u een langere stuk code wilt uitvoeren, moet u streams gebruiken.<br \/>\nEr worden twee argumenten geaccepteerd:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 de string of stream van Python code om uit te voeren.<\/li>\n<li><code>variable<\/code> \u2014 (optioneel) wijs het resultaat van de uitvoering toe <code>code<\/code> aan deze Python-variabele.<\/li>\n<\/ul>\n<p><\/p>\n<p>Voorbeeld van gebruik:<\/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>In dit voorbeeld vermenigvuldigen we 2 met 3 en schrijven we het resultaat naar de Python-variabele. <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Gegevensoverdracht<\/h2>\n<p><\/p>\n<p>Gegevens doorgeven naar Python en terug.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Er zijn 4 manieren om de waarde van een Python-variabele in InterSystems IRIS te krijgen, afhankelijk van de serialisatie die u nodig heeft:<\/p>\n<p><\/p>\n<ul>\n<li><code>String<\/code> voor eenvoudige gegevenstypen en debugging.<\/li>\n<li><code>Repr<\/code> voor het opslaan van eenvoudige objecten en debugging.<\/li>\n<li><code>of een ander formaat.<\/code> voor gemakkelijke manipulatie van gegevens aan de kant van InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> voor het bewaren van objecten.<\/li>\n<\/ul>\n<p><\/p>\n<p>Deze methoden maken het mogelijk om variabelen vanuit Python te verkrijgen in de vorm van een string of streams.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 verkrijgen <code>serialisatie<\/code> variabele <code>variable<\/code> in <code>stream<\/code>. Als <code>useString<\/code> is gelijk aan 1 en de serialisatie wordt in een string geplaatst, dan wordt een string in plaats van een stream teruggegeven.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 verkrijg JSON-serialisatie van de variabele.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 verkrijg Pickle (of Dill) serialisatie van de variabele.<\/li>\n<\/ul>\n<p><\/p>\n<p>Laten we proberen onze variabele te verkrijgen <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>Laden van gegevens uit InterSystems IRIS in Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 cre\u00ebert een gegevensset (pandas <code>dataframe<\/code> of <code>lijst<\/code>) uit een sql-query en stelt deze in als een Python-variabele. <code>variable<\/code>Het pakket <code>isc.py<\/code> moet beschikbaar zijn in het gebied <code>namespace<\/code> \u2014 daar zal de query uitgevoerd worden.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 laadt gegevens van een global <code>global<\/code> van een subscrip. <code>start<\/code> tot <code>end<\/code> in Python als een variabele van het type <code>type<\/code>: <code>lijst<\/code>, of pandas <code>dataframe<\/code>. Beschrijving van optionele argumenten <code>mask<\/code> en <code>labels<\/code> beschikbaar in de documentatie van de klasse en de repository <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 laadt gegevens van de klasse <code>klasse<\/code> van id <code>start<\/code> tot <code>end<\/code> in Python als een variabele van het type <code>type<\/code>: <code>lijst<\/code>, of pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 lijst (gescheiden door een komma) van klasse-eigenschappen die in de gegevensset moeten worden geladen. Maskers worden ondersteund. <code>*<\/code> en <code>?<\/code>. Standaard \u2014 <code>*<\/code> (alle eigenschappen). Eigenschap <code>%%CLASSNAME<\/code> wordt genegeerd.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 laadt gegevens van de tabel <code>table<\/code> van id <code>start<\/code> tot <code>end<\/code> in Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 is universeel (elke geldige SQL-query wordt doorgegeven aan Python). Echter, <code>ExecuteGlobal<\/code> en zijn wrappers <code>ExecuteClass<\/code> en <code>ExecuteTable<\/code> werken met een aantal beperkingen. Ze zijn veel sneller (3-5 keer sneller dan ODBC-driver en 20 keer sneller <code>ExecuteQuery<\/code>). Verdere informatie in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<br \/>\nAl deze methoden ondersteunen gegevensoverdracht vanuit elke ruimte. Het pakket <code>isc.py<\/code> moet beschikbaar zijn in de doelruimte.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 overdracht van de resultaten van elke geldige SQL-query naar Python. Dit is de langzaamste methode voor gegevensoverdracht. Gebruik dit als <code>ExecuteGlobal<\/code> en zijn wrappers niet beschikbaar zijn.<\/p>\n<p><\/p>\n<p>Argumenten:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 sql-query.<\/li>\n<li><code>variable<\/code> \u2014 naam van de Python-variabele waarin gegevens worden opgeslagen.<\/li>\n<li><code>type<\/code> \u2014 <code>lijst<\/code> of Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 gebied waarin de query zal worden uitgevoerd.<\/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 overdracht van de global naar Python.<\/p>\n<p><\/p>\n<p>Argumenten:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 naam van de global zonder <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 naam van de Python-variabele waarin gegevens worden opgeslagen.<\/li>\n<li><code>type<\/code> \u2014 <code>lijst<\/code> of Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 eerste subscrip van de global. Verplicht <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 laatste subscrip van de global. Verplicht <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 waarde mask van de globale. Het mask kan korter zijn dan het aantal velden in de globale (in dat geval worden de velden aan het einde overgeslagen). Hoe het mask te formatteren:\n<ul>\n<li><code>+<\/code> geef de waarde door zoals deze is.<\/li>\n<li><code>-<\/code> sla de waarde over.<\/li>\n<li><code>b<\/code> \u2014 Logisch type (<code>0<\/code> \u2014 <code>False<\/code>, alles andere is \u2014 <code>Waar<\/code>).<\/li>\n<li><code>We verwijderen de huidige partitie om een nieuwe aan te maken voor in totaal 50 GB.<\/code> \u2014 Datum (vanaf $horolog, op Windows vanaf 1970, op Linux vanaf 1900).<\/li>\n<li><code>t<\/code> \u2014 Tijd ($horolog, seconden na middernacht).<\/li>\n<li><code>m<\/code> \u2014 Tijdstempel (string in het formaat JAAR-MAAND-DAG UUR:MINUUT:SECOND).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Lijst van kolomnamen. Het eerste element is de naam van de subscript.<\/li>\n<li><code>namespace<\/code> \u2014 gebied waarin de query zal worden uitgevoerd.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Wrapper voor <code>ExecuteGlobal<\/code>. Bereidt de aanroep voor op basis van de klasse-definitie <code>ExecuteGlobal<\/code> en roept deze aan.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 gegevensoverdracht van de klasse in Python.<\/p>\n<p><\/p>\n<p>Argumenten:<\/p>\n<p><\/p>\n<ul>\n<li><code>klasse<\/code> \u2014 naam van de klasse<\/li>\n<li><code>variable<\/code> \u2014 naam van de Python-variabele waarin gegevens worden opgeslagen.<\/li>\n<li><code>type<\/code> \u2014 <code>lijst<\/code> of Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 start Id.<\/li>\n<li><code>end<\/code> \u2014 eind Id<\/li>\n<li><code>properties<\/code> \u2014 lijst (gescheiden door een komma) van klasse-eigenschappen die in de gegevensset moeten worden geladen. Maskers worden ondersteund. <code>*<\/code> en <code>?<\/code>. Standaard \u2014 <code>*<\/code> (alle eigenschappen). Eigenschap <code>%%CLASSNAME<\/code> wordt genegeerd.<\/li>\n<li><code>namespace<\/code> \u2014 gebied waarin de query zal worden uitgevoerd.<\/li>\n<\/ul>\n<p><\/p>\n<p>Alle eigenschappen worden doorgegeven zoals ze zijn, behalve de eigenschappen van types <code>te<\/code>, <code>%Tijd<\/code>, <code>%Boolean<\/code> en <code>%Tijdstempel<\/code> \u2014 deze worden geconverteerd naar de bijbehorende Python-klassen.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Wrapper voor <code>ExecuteClass<\/code>. Zet de tabelnaam om naar de klassenaam en roept deze aan <code>ExecuteClass<\/code>. Handtekening:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 gegevensoverdracht van de tabel naar Python.<\/p>\n<p><\/p>\n<p>Argumenten:<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 naam van de tabel.<br \/>\nAlle andere argumenten worden doorgegeven zoals ze zijn in <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Opmerkingen<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> en <code>ExecuteTable<\/code> werken even snel.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 keer sneller dan <code>ExecuteQuery<\/code> op grote datasets (overdrachtsduur meer dan &gt;0.01 seconde).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> en <code>ExecuteTable<\/code> werken op globalen met deze structuur: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> waar <code>key<\/code> \u2014 geheel getal.<\/li>\n<li>Voor <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> en <code>ExecuteTable<\/code> ondersteunde waarde range <code>te<\/code> komt overeen met het bereik <code>mktime<\/code> en afhankelijk van het besturingssysteem (<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>). Gebruik <code>%Tijdstempel<\/code>voor gegevensoverdracht buiten dit bereik of gebruik een pandas dataframe, aangezien deze beperking alleen voor de lijst geldt.<\/li>\n<li>Voor <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> en <code>ExecuteTable<\/code> alle argumenten behalve de gegevensbron (globale, klasse of tabel) en de variabele zijn optioneel.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Voorbeelden<\/h2>\n<p><\/p>\n<p>Testklasse <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> bevat een methode die alle opties voor gegevensoverdracht demonstreert:<\/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\/\/ Algemene argumenten\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ Methode 0: ExecuteGlobal zonder argumenten\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ Methode 1: ExecuteGlobal met argumenten    \n\/\/ Bij het doorgeven van de globale worden de veldnamen handmatig ingesteld\n\/\/ globalKey - naam van de subscript \nset labels = $lb(\"globalKey\", \"Name\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask bevat 1 element minder dan labels omdat \"globalKey\" - naam van de subscript\n\/\/ We slaan %%CLASSNAME over\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ Methode 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ Methode 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ Methode 4: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Roep de methode aan <code>do ##class(isc.py.test.Person).Test()<\/code> om te zien hoe alle datatransfermethoden werken.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Hulpmethoden<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 verkrijg informatie over de variabele: of deze is gedefinieerd, klasse en lengte van serialisatie.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 is de variabele gedefinieerd.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 verkrijg de klasse van de variabele.<\/li>\n<li><code>GetStatus()<\/code> \u2014 verkrijg en verwijder de laatste uitzondering aan de Python-zijde.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 verkrijg de variabele van de module en de importstatus.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 verkrijg informatie over de functie.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabiliteit<\/h1>\n<p><\/p>\n<p>U heeft geleerd om de Python Gateway vanuit de terminal aan te roepen, laten we het nu in de productie gebruiken. De basis van de interactie met Python in deze modus is <code>isc.py.ens.Operation<\/code>. Dit stelt ons in staat om:<\/p>\n<p><\/p>\n<ul>\n<li>Python-code uit te voeren<\/li>\n<li>Python-context op te slaan\/herstellen<\/li>\n<li>gegevens uit Python te laden en te ontvangen<\/li>\n<\/ul>\n<p><\/p>\n<p>In principe is de Python-operatie een wrapper rond <code>isc.py.Main<\/code>. De operatie <code>isc.py.ens.Operation<\/code> biedt de mogelijkheid tot interactie met het Python-proces vanuit InterSystems IRIS-producties. Vijf verzoeken worden ondersteund:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> voor het uitvoeren van Python-code. Retourneert <code>isc.py.msg.ExecutionResponse<\/code> met het uitvoeringsresultaat en de gevraagde variabelen.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> voor het uitvoeren van Python-code. Retourneert <code>isc.py.msg.StreamExecutionResponse<\/code> met het uitvoeringsresultaat en de gevraagde variabelen. Dit is vergelijkbaar, maar accepteert en retourneert streams in plaats van tekens. <code>isc.py.msg.ExecutionRequest<\/code>isc.py.msg.QueryRequest<\/li>\n<li><code>voor het doorgeven van het resultaat van de uitvoering van de SQL-aanroep. Retourneert<\/code> Ens.Response <code>isc.py.msg.GlobalRequest<\/code>.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code>\/<code>isc.py.msg.TableRequest<\/code>\/<code>isc.py.msg.TableRequest<\/code> voor het overdragen van gegevens van de global\/klasse\/tabel. Retourneert <code>isc.py.msg.GlobalRequest<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> voor het opslaan van de Python-context. Retourneert <code>Ens.StringResponse<\/code> met de context-id.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> voor het herstellen van de Python-context.<\/p>\n<p><\/p>\n<p>Daarnaast <code>isc.py.ens.Operation<\/code> heeft twee instellingen:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 selectie van de klasse die het interface implementeert <code>isc.py.init.Abstract<\/code>. Dit kan worden gebruikt voor het laden van functies, modules, klassen, enz. Het wordt eenmaal uitgevoerd bij het starten van het proces.<\/li>\n<li><code>PythonLib<\/code> \u2014 (alleen voor Linux) als je fouten ziet bij het laden, stel de waarde in op <code>libpython3.6m.so<\/code> of zelfs het volledige pad naar de Python-bibliotheek. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Businessprocessen cre\u00ebren<\/h2>\n<p><\/p>\n<p>Er zijn twee klassen beschikbaar die het ontwikkelen van businessprocessen vergemakkelijken:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> maakt het mogelijk om annotaties uit activiteiten te extraheren met variabelen.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> maakt het gemakkelijk om businessprocessen met Python te testen. Het kan een businessproces (delen in Python) in het huidige proces uitvoeren.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Variabelen substitueren<\/h2>\n<p><\/p>\n<p>Alle businessprocessen die afstammen van <code>isc.py.ens.ProcessUtils<\/code>, kunnen de methode <code>GetAnnotation(name) gebruiken<\/code> om de waarde van de annotatie van een activiteit op basis van de naam op te halen. De annotatie van de activiteit kan variabelen bevatten, die aan de InterSystems IRIS-kant worden berekend voordat ze naar Python worden doorgestuurd. Hier is de syntaxis voor het substitueren van variabelen:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 aanroepen van de methode<\/li>\n<li><code>#{expr}<\/code> \u2014 code uitvoeren in ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Een voorbeeld is beschikbaar in het testbusinessproces <code>isc.py.test.Process<\/code>, bijv. in de activiteit <code>Correlation Matrix: Graph<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. In dit voorbeeld:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> geeft de eigenschap WorkDirectory van het object terug <code>process<\/code>, dat een instantie is van de klasse <code>isc.py.test.Process<\/code> d.w.z. het huidige businessproces.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> de methode <code>Integer<\/code> klasse <code>%PopulateUtils<\/code>, met het doorgeven van argumenten <code>1<\/code> en <code>100<\/code>, retourneert een willekeurig geheel getal in het bereik <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Testbusinessproces<\/h2>\n<p><\/p>\n<p>Testproductie en testbusinessproces zijn standaard beschikbaar als onderdeel van de Python Gateway. Om ze te gebruiken:<\/p>\n<p><\/p>\n<ol>\n<li>Voer in de OS-terminal uit: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>Voer in de InterSystems IRIS-terminal uit: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> om testgegevens in te vullen.<\/li>\n<li>Start de productie <code>isc.py.test.Production<\/code>.<\/li>\n<li>Stuur een aanvraag van het type <code>Ens.Request<\/code> in <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Laten we zien hoe dit allemaal samenwerkt. Open <code>isc.py.test.Process<\/code> in de BPL-editor:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in 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\">Code uitvoeren<\/h3>\n<p><\/p>\n<p>De belangrijkste aanroep is het uitvoeren van Python-code:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Maakt gebruik van de aanvraag <code>isc.py.msg.ExecutionRequest<\/code>, hier zijn de eigenschappen:<\/p>\n<p><\/p>\n<ul>\n<li><code>Code<\/code> \u2014 Python-code.<\/li>\n<li><code>SeparateLines<\/code> \u2014 moet de code op verschillende regels worden uitgevoerd. <code>$c(10)<\/code> (<code>n<\/code>) wordt gebruikt om regels te scheiden. Let op, het is NIET aanbevolen om het bericht in \u00e9\u00e9n keer te verwerken; deze functie is alleen bedoeld voor verwerking <code>def<\/code> en soortgelijke meerregelige uitdrukkingen. Standaard <code>0<\/code>.<\/li>\n<li><code>Variabelen<\/code> \u2014 een door komma's gescheiden lijst van variabelen die aan de reactie zullen worden toegevoegd.<\/li>\n<li><code>Serialisatie<\/code> \u2014 Hoe variabelen te serialiseren die we willen retourneren. Opties: <code>Str<\/code>, <code>Repr<\/code>, <code>of een ander formaat.<\/code>, <code>Pickle<\/code> en <code>Dill<\/code>, standaard <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>In ons geval stellen we alleen de eigenschap in <code>Code<\/code>, zodat alle andere eigenschappen standaardwaarden gebruiken. We stellen deze in door <code>process.GetAnnotation(\"Import pandas\")<\/code>, die tijdens de uitvoering de annotatie retourneert na het uitvoeren van het substitutie van variabelen. Uiteindelijk zal de code <code>import pandas as pd<\/code> worden doorgegeven aan Python. <code>GetAnnotation<\/code> kan nuttig zijn voor het verkrijgen van meerregelige Python-scripts, maar er zijn geen beperkingen aan deze manier van het krijgen van code. U kunt de eigenschap <code>Code<\/code> op elke voor u handige manier instellen.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Het verkrijgen van variabelen<\/h3>\n<p><\/p>\n<p>Nog een interessante oproep met gebruik van <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Correlatiematrix: Tabel<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Het berekent de correlatiematrix aan de Python-kant en haalt de variabele <code>corrmat<\/code> terug naar InterSystems IRIS in JSON-formaat, door de eigenschappen van de aanvraag in te stellen:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabelen<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serialisatie<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>We kunnen de resultaten zien in Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En als we deze waarde nodig hebben in BP, kan deze zo worden verkregen: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Gegevensoverdracht<\/h3>\n<p><\/p>\n<p>Laten we vervolgens praten over het verzenden van gegevens van InterSystems IRIS naar Python; alle datatransfer-aanvragen implementeren de interface <code>isc.py.msg.DataRequest<\/code>, die de volgende eigenschappen biedt:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabele<\/code> \u2014 een Python-variabele waarin de gegevens worden opgeslagen.<\/li>\n<li><code>Type<\/code> \u2014 het type variabele: <code>dataframe<\/code> (pandas dataframe) of <code>lijst<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 het gebied waaruit we gegevens ophalen. Het pakket <code>isc.py<\/code> moet beschikbaar zijn in dit gebied. Dit kan een gebied zijn zonder ondersteuning voor producten.<\/li>\n<\/ul>\n<p><\/p>\n<p>Op basis van deze interface zijn er 4 klassen van aanvragen ge\u00efmplementeerd:<\/p>\n<p><\/p>\n<ul>\n<li><code>voor het doorgeven van het resultaat van de uitvoering van de SQL-aanroep. Retourneert<\/code> \u2014 stel de eigenschap in <code>Query<\/code> om een SQL-aanroep door te geven.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 stel de eigenschap in <code>Class<\/code> om gegevens van een klasse door te geven.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 stel de eigenschap in <code>Table<\/code> om gegevens van een tabel door te geven.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 stel de eigenschap in <code>Global<\/code> om gegevens van een globale door te geven.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tijdens het testproces kijk naar de activiteit <code>RAW<\/code>, waar <code>voor het doorgeven van het resultaat van de uitvoering van de SQL-aanroep. Retourneert<\/code> getoond in actie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in 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\">Opslaan\/herstellen van de Python-context<\/h3>\n<p><\/p>\n<p>Ten slotte kunnen we de Python-context opslaan in InterSystems IRIS; om dit te doen, sturen we <code>isc.py.msg.SaveRequest<\/code> met argumenten:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2014 Alleen die variabelen worden opgeslagen die aan de masker voldoen. Ondersteunde formaten zijn <code>*<\/code> en <code>?<\/code>. Voorbeeld: <code>\"Data*, Figure?\"<\/code>. Standaard <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Maximale lengte van de opgeslagen variabele. Als de serialisatie van de variabele langer is, wordt deze genegeerd. Stel 0 in om variabelen van elke lengte te krijgen. Standaard. <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Naam<\/code> \u2014 Naam van de context (optioneel).<\/li>\n<li><code>Beschrijving<\/code> \u2014 Beschrijving van de context (optioneel).<\/li>\n<\/ul>\n<p><\/p>\n<p>Geeft terug <code>Ens.StringResponse<\/code> met <code>Id<\/code> van de opgeslagen context. Kijk naar de activiteit in het testproces. <code>Save Context<\/code>.<\/p>\n<p><\/p>\n<p>De overeenkomstige aanvraag <code>isc.py.msg.RestoreRequest<\/code> laadt de context van InterSystems IRIS in Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identificatie van de context.<\/li>\n<li><code>Wis<\/code> \u2014 de context leegmaken voordat deze wordt hersteld.<\/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 is een webtoepassing met open source die het mogelijk maakt om notebooks te cre\u00ebren met code, visualisaties en tekst en deze te publiceren. Python Gateway maakt het mogelijk om BPL-processen te bekijken en te bewerken in de vorm van Jupyter Notebook. Let op dat momenteel de reguliere Python 3 executor wordt gebruikt.<\/p>\n<p><\/p>\n<p>Deze uitbreiding gaat ervan uit dat annotaties Python-code bevatten en activiteitnamen gebruiken als voorafgaande titels. Het is nu mogelijk om PythonGateway-bureauprocessen te ontwikkelen in Jupyter Notebook. Dit is wat mogelijk is: <\/p>\n<p><\/p>\n<ul>\n<li>Nieuwe bedrijfsprocessen cre\u00ebren<\/li>\n<li>Bedrijfsprocessen verwijderen<\/li>\n<li>Nieuwe activiteiten cre\u00ebren<\/li>\n<li>Activiteiten wijzigen<\/li>\n<li>Activiteiten verwijderen<\/li>\n<\/ul>\n<p><\/p>\n<p>Hier is <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">demo-video<\/a><\/noindex>. En enkele screenshots:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Procesverkenner<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in 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\">Proceseditor<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in 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\">Installatie<\/h2>\n<p><\/p>\n<ol>\n<li>U heeft InterSystems IRIS 2019.2+ nodig.<\/li>\n<li>Installeer PythonGateway v0.8+ (alleen nodig <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> en <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Werk de ObjectScript code bij uit de repository.<\/li>\n<li>Voer uit <code>do ##class(isc.py.util.Jupyter).Install()<\/code> en volg de aanwijzingen.<\/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\">Conclusies<\/h1>\n<p><\/p>\n<p>MLToolkit is een set hulpmiddelen met als doel modellen en transactieomgevingen te combineren, zodat de gebouwde modellen gemakkelijk kunnen worden gebruikt in uw bedrijfsprocessen. Python Gateway is onderdeel van MLToolkit en biedt integratie met de programmeertaal Python, waardoor elke machine learning-algoritme die in Python is gemaakt (de belangrijkste omgeving voor veel Data Scientists), kan worden georkestreerd met talrijke kant-en-klare bibliotheken voor het snel cre\u00ebren van aanpasbare, geautomatiseerde analytische AI\/ML-oplossingen op het InterSystems IRIS-platform.<\/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\/\">Vorige artikel<\/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\">Python Gateway Voorbeelden<\/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 bit<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">Documentatie en cursussen over Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>De MLToolkit-gebruikersgroep is een priv\u00e9repository op GitHub, opgericht als onderdeel van de bedrijfsorganisatie InterSystems op GitHub. Het is gericht op externe gebruikers die componenten van MLToolkit installeren, bestuderen of al gebruiken, inclusief de Python Gateway. In de groep zijn verschillende gerealiseerde casestudies beschikbaar (met broncode en testgegevens) in de sectoren marketing, productie, geneeskunde en veel andere industrie\u00ebn. Om lid te worden van de ML Toolkit-gebruikersgroep, stuur alstublieft een kort bericht per e-mail naar het volgende adres: <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> en vermeld in uw e-mail de volgende gegevens:<\/p>\n<p><\/p>\n<ul>\n<li>GitHub-gebruikersnaam<\/li>\n<li>Organisatie (waar u werkt of studeert)<\/li>\n<li>Functie (uw feitelijke functie in uw organisatie, of \"Student\", of \"Freelancer\").<\/li>\n<li>Land<\/li>\n<\/ul>\n<p><\/p>\n<p>Degenen die het artikel hebben gelezen en ge\u00efnteresseerd zijn in de mogelijkheden van InterSystems IRIS als platform voor de ontwikkeling of hosting van kunstmatige intelligentie en machine learning mechanismen, bieden we aan om mogelijke scenario's te bespreken die interessant zijn voor uw onderneming. We analyseren graag de behoeften van uw bedrijf en bepalen gezamenlijk een actieplan; e-mailadres van onze AI\/ML-expertgroep is: <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Bron: <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.5 - 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\/nl\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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 in InterSystems IRIS | ProHoster","description":"Dit artikel is gewijd aan de Python Gateway \u2014 een community-project met open source voor het InterSystems IRIS-databaseplatform.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}