{"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\/da\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway i InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Denne artikel handler om Python Gateway \u2014 et community-projekt med \u00e5bent kildekode til InterSystems IRIS dataplatform. Dette projekt g\u00f8r det muligt at orkestrere alle maskinl\u00e6ringsalgoritmer, der er skrevet i Python (den prim\u00e6re platform for mange dataforskere), og anvende mange f\u00e6rdige biblioteker til hurtigt at skabe adaptive, robotiserede analytiske AI\/ML-l\u00f8sninger p\u00e5 InterSystems IRIS-platformen. I denne artikel vil jeg vise, hvordan InterSystems IRIS kan orkestrere processer i Python, effektivt muligg\u00f8re tovejs dataoverf\u00f8rsel og skabe intelligente forretningsprocesser.<\/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>Introduktion.<\/li>\n<li>V\u00e6rkt\u00f8jer.<\/li>\n<li>Installation.<\/li>\n<li>API.<\/li>\n<li>Interoperabilitet.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Konklusioner.<\/li>\n<li>Links.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introduktion<\/h1>\n<p><\/p>\n<p>Python er et h\u00f8j-niveau programmeringssprog for almindelig brug, der fokuserer p\u00e5 at forbedre udviklerens produktivitet og l\u00e6sbarheden af koden. I denne serie af artikler vil jeg tale om anvendelsesmulighederne for Python p\u00e5 InterSystems IRIS-platformen, hvor denne artikel har fokus p\u00e5 anvendelsen af Python som sprog for oprettelse og brug af maskinl\u00e6ringsmodeller.<\/p>\n<p><\/p>\n<p>Maskinl\u00e6ring (ML) er en klasse af metoder inden for kunstig intelligens, hvor kendetegnet ikke er direkte l\u00f8sning p\u00e5 opgaver, men l\u00e6ring ved at l\u00f8se mange lignende opgaver. <\/p>\n<p><\/p>\n<p>Algoritmer og modeller for maskinl\u00e6ring bliver stadig mere udbredte. Der er mange grunde til dette, men det hele kommer ned til tilg\u00e6ngelighed, enkelhed og opn\u00e5else af praktiske resultater. Er clustering eller endda neuralt netv\u00e6rksmodellering en ny teknologi? <\/p>\n<p><\/p>\n<p>Selvf\u00f8lgelig ikke, men i \u00f8jeblikket er der ikke behov for at skrive hundredtusindvis af linjer kode for at k\u00f8re en model, og omkostningerne ved at oprette og anvende modeller bliver mindre og mindre.<\/p>\n<p><\/p>\n<p>V\u00e6rkt\u00f8jerne udvikler sig \u2014 selvom vi ikke har fuldt GUI-orienterede AI\/ML-v\u00e6rkt\u00f8jer, observerer vi den samme udvikling som set med mange andre klasser af informationssystemer, s\u00e5som BI (fra kode til brug af frameworks og GUI-orienterede konfigurerbare l\u00f8sninger), der ogs\u00e5 ses i v\u00e6rkt\u00f8jer til oprettelse af AI\/ML. Vi er allerede forbi kode-skrivningsfasen og bruger i dag frameworks til at opbygge og tr\u00e6ne modeller.<\/p>\n<p><\/p>\n<p>Andre forbedringer, s\u00e5som muligheden for at distribuere fortr\u00e6nede modeller, n\u00e5r slutbrugeren bare skal afslutte tr\u00e6ningen af modellen p\u00e5 sine specifikke data, g\u00f8r det ogs\u00e5 lettere at komme i gang med maskinl\u00e6ring. Disse fremskridt letter betydeligt l\u00e6ringen af maskinl\u00e6ring b\u00e5de direkte for specialister og for virksomheder generelt.<\/p>\n<p><\/p>\n<p>P\u00e5 den anden side samler vi flere og flere data. Takket v\u00e6re en samlet dataplatform som InterSystems IRIS kan al denne information straks forberedes og anvendes som inputdata til maskinl\u00e6ringsmodeller.<\/p>\n<p><\/p>\n<p>Med overgangen til cloud bliver lanceringen af AI\/ML-projekter lettere end nogensinde. Vi kan kun forbruge de ressourcer, vi har brug for. Desuden, takket v\u00e6re paralleliseringen, der tilbydes af cloudplatforme, kan vi spare tid.<\/p>\n<p><\/p>\n<p>Men hvordan st\u00e5r det til med resultaterne? Her bliver det mere kompliceret. Der findes mange v\u00e6rkt\u00f8jer til at bygge modeller, som jeg vil tale om senere. At bygge en god model er ikke enkelt, men hvad s\u00e5? At f\u00e5 afkast af at bruge modellen i virksomheden er ogs\u00e5 en ikke-triviel opgave. Problemet ligger i adskillelsen af analytiske og transaktionelle belastninger samt datamodeller. N\u00e5r vi tr\u00e6ner en model, g\u00f8r vi det typisk p\u00e5 historiske data. Men en bygget models plads er i den transaktionelle databehandling. Hvad nytter det at have den bedste model til at opdage svigagtige transaktioner, hvis vi kun k\u00f8rer den \u00e9n gang om dagen? Svindlerne er allerede forsvundet med pengene. Vi skal tr\u00e6ne modellen p\u00e5 historiske data, men vi skal ogs\u00e5 anvende den i realtid p\u00e5 nye indkommende data, s\u00e5 vores forretningsprocesser kan handle i overensstemmelse med de forudsigelser, modellen laver.<\/p>\n<p><\/p>\n<p>ML Toolkit er et s\u00e6t v\u00e6rkt\u00f8jer, hvis m\u00e5l er netop dette: at forene modeller og den transaktionelle milj\u00f8, s\u00e5 de byggede modeller nemt kan anvendes direkte i dine forretningsprocesser. Python Gateway er en del af ML Toolkit og sikrer integration med Python-sproget (ligesom R Gateway, der er en del af ML Toolkit, sikrer integration med R-sproget).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">V\u00e6rkt\u00f8jer<\/h1>\n<p><\/p>\n<p>F\u00f8r vi forts\u00e6tter, vil jeg gerne beskrive nogle v\u00e6rkt\u00f8jer og biblioteker til Python, som vi senere vil bruge.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Teknologier<\/h2>\n<p><\/p>\n<ul>\n<li>Python er et fortolket, h\u00f8jniveau programmeringssprog til generelle form\u00e5l. Den prim\u00e6re fordel ved sproget er det store bibliotek af matematiske, ML- og AI-biblioteker. Ligesom ObjectScript er det et objektorienteret sprog, men alt defineres dynamisk og ikke statisk. Alt er ogs\u00e5 et objekt. Senere artikler foruds\u00e6tter en overfladisk bekendtskab med sproget. Hvis du \u00f8nsker at starte med at l\u00e6re, anbefaler jeg at begynde med <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">dokumentationen<\/a><\/noindex>.<\/li>\n<li>For vores n\u00e6ste \u00f8velser skal du installere <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: Jeg bruger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, men generelt er der ogs\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">mange<\/a><\/noindex>. Hvis du bruger Atelier, findes der en Eclipse-plugin til Python-udviklere. Hvis du bruger VS Code, findes der en udvidelse til Python. <\/li>\n<li>Notebook: I stedet for et IDE kan du skrive og dele dine scripts i online-notebooks. Den mest popul\u00e6re er <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Biblioteker<\/h2>\n<p><\/p>\n<p>Her er en (ikke-udt\u00f8mmende) liste over biblioteker til maskinl\u00e6ring:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 den fundamentale pakke til pr\u00e6cise beregninger.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 h\u00f8jtydende datastrukturer og datanalysev\u00e6rkt\u00f8jer.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 til graftegning.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 datavisualisering baseret p\u00e5 matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 metoder til maskinl\u00e6ring.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 algoritmer til maskinl\u00e6ring inden for gradient boosting-metodologi.<\/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 netv\u00e6rk.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 en platform til at bygge modeller til maskinl\u00e6ring.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 en platform til at bygge modeller til maskinl\u00e6ring, der er fokuseret p\u00e5 Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML fra forskellige modeller.<\/li>\n<\/ul>\n<p><\/p>\n<p>AI\/ML-teknologier g\u00f8r det muligt at g\u00f8re forretningen mere effektiv og tilpasningsdygtig. Desuden bliver disse teknologier i dag lettere at udvikle og implementere. Begynd at l\u00e6re AI\/ML-teknologier og hvordan de kan hj\u00e6lpe din organisation med at vokse.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Installation<\/h1>\n<p><\/p>\n<p>Der er flere m\u00e5der at installere og bruge Python Gateway p\u00e5:<\/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>Brug et billede fra DockerHub<\/li>\n<li>Opret dit eget billede<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Uanset hvilken installationsmetode du v\u00e6lger, skal du bruge kildekoden. Det eneste sted at downloade koden er <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">udgivelsessiden<\/a><\/noindex>. Den indeholder testede stabile versioner, s\u00e5 tag bare den nyeste. I \u00f8jeblikket er det 0.8, men der vil komme nye versioner over tid. Klon eller upload ikke opbevaringen, download den seneste udgivelse.<\/p>\n<p><\/p>\n<h2 id=\"os\">OS<\/h2>\n<p><\/p>\n<p>Hvis du installerer Python Gateway p\u00e5 operativsystemet, skal du f\u00f8rst (uanset operativsystemet) installere Python. For dette:<\/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 bit<\/a><\/noindex>. Det anbefales at installere Python i standardmappen.<\/li>\n<li>Installer modulet <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Download ObjectScript-koden (dvs. <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\",,1)<\/code>) til enhver namespace med produkter. Hvis du \u00f8nsker, at den eksisterende namespace skal underst\u00f8tte produkter, skal du udf\u00f8re: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Plac\u00e9r <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> til mappen <code>bin<\/code> din Instance af InterSystems IRIS. Biblioteksfilen skal v\u00e6re tilg\u00e6ngelig p\u00e5 stien, der returneres <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>S\u00f8rg for, at milj\u00f8variablen <code>PYTHONHOME<\/code> peger p\u00e5 Python 3.6.7.<\/li>\n<li>S\u00f8rg for, at systemmilj\u00f8variablen <code>PATH<\/code> indeholder variablen <code>PYTHONHOME<\/code> (eller den mappe, den peger p\u00e5).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Kontroll\u00e9r hermed, at milj\u00f8variablen <code>PATH<\/code> indeholder <code>\/usr\/lib<\/code> og <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Brug filen <code>\/etc\/environment<\/code> til at indstille milj\u00f8variabler.<\/li>\n<li>I tilf\u00e6lde af fejl <code>undefined symbol: _Py_TrueStruct<\/code> skal du indstille parameteren <code>PythonLib<\/code>. Derudover er der <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> en sektion til fejlfinding.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>I \u00f8jeblikket underst\u00f8ttes kun Python 3.6.7 fra <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Kontroller variablen <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Hvis du har \u00e6ndret milj\u00f8variabler, skal du genstarte dit produkt InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>Brugen af containere har flere fordele: <\/p>\n<p><\/p>\n<ul>\n<li>B\u00e6rbarhed<\/li>\n<li>Effektivitet<\/li>\n<li>Isolation<\/li>\n<li>Letv\u00e6gts<\/li>\n<li>Immutabilitet<\/li>\n<\/ul>\n<p><\/p>\n<p>Tag et kig p\u00e5 denne <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">artikelserie<\/a><\/noindex> for mere information om brugen af Docker med InterSystems-produkter. <\/p>\n<p><\/p>\n<p>Alle builds af Python Gateway er i \u00f8jeblikket baseret p\u00e5 containere. <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Klar billede<\/h3>\n<p><\/p>\n<p>Udf\u00f8r: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, for at downloade og starte Python Gateway med InterSystems IRIS Community Edition. Det er det hele.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Opret dit eget billede<\/h3>\n<p><\/p>\n<p>For at bygge docker-billedet skal du udf\u00f8re i rodmappen af dit repository: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nSom standard bygges billedet baseret p\u00e5 billedet <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, men du kan \u00e6ndre dette ved at indstille variablen <code>IMAGE<\/code>.<br \/>\nFor at bygge fra InterSystems IRIS, udf\u00f8r: `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>Derefter kan du starte docker-billedet:<\/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>Hvis du bruger et billede baseret p\u00e5 InterSystems IRIS Community Edition, skal du muligvis ikke angive n\u00f8glen.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Comments<\/h3>\n<p><\/p>\n<ul>\n<li>Testprocessen <code>isc.py.test.Process<\/code> gemmer en r\u00e6kke billeder i en midlertidig mappe. Du vil muligvis \u00e6ndre denne sti til en monteret mappe. For at g\u00f8re dette skal du redigere indstillingen <code>WorkingDir<\/code> ved at angive den monterede mappe.<\/li>\n<li>For at f\u00e5 adgang til terminalen skal du k\u00f8re: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Adgang til System Management Portal med login <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>For at stoppe containeren, k\u00f8r: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Tjek installationen<\/h2>\n<p><\/p>\n<p>N\u00e5r du har installeret Python Gateway, er det en god id\u00e9 at kontrollere, om den fungerer. K\u00f8r denne kode i terminalen 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>Resultatet skal v\u00e6re <code>HELLO<\/code> \u2014 v\u00e6rdien af Python-variablen <code>x<\/code>. Hvis den returnerede status <code>sc<\/code> er en fejl eller <code>var<\/code> tom, skal du kontrollere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 Troubleshooting section<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway er installeret, og du har bekr\u00e6ftet, at den fungerer. Det er tid til at begynde at bruge den!<br \/>\nHovedgr\u00e6nsefladen til Python er <code>isc.py.Main<\/code>. Den tilbyder f\u00f8lgende grupper af metoder (alle returnerer <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Udf\u00f8relse af kode<\/li>\n<li>Overf\u00f8rsel af data<\/li>\n<li>Hj\u00e6lpemidler<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Udf\u00f8relse af kode<\/h2>\n<p><\/p>\n<p>Disse metoder giver mulighed for at udf\u00f8re vilk\u00e5rlig Python-kode.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 er den prim\u00e6re metode. Den accepterer 4 valgfrie argumenter:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 koden der skal udf\u00f8res. Linjeskift: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 navnet p\u00e5 variablen til retur.<\/li>\n<li><code>serialization<\/code> \u2014 hvordan der skal serialiseres. <code>returnVariable<\/code>. 0 \u2014 string (standard), 1 \u2014 repr.<\/li>\n<li><code>resultat<\/code> \u2014 ByRef reference til variablen, hvor v\u00e6rdien skrives <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ovenfor har vi udf\u00f8rt:<\/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>I dette eksempel tildeler vi Python-variablen <code>x<\/code> v\u00e6rdien <code>Hej<\/code> og \u00f8nsker at returnere v\u00e6rdien af Python-variablen <code>x<\/code> til ObjectScript-variablen <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode er et mere sikkert og mindre begr\u00e6nset alternativ <code>SimpleString<\/code>.<br \/>\nStrenge i InterSystems IRIS-platformen er begr\u00e6nset til 3.641.144 tegn, og hvis du vil udf\u00f8re en l\u00e6ngere kode, skal du bruge streams.<br \/>\nDet accepterer to argumenter:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 en streng eller stream af Python-kode til udf\u00f8relse.<\/li>\n<li><code>variable<\/code> \u2014 (valgfrit) tildeler resultatet af udf\u00f8relsen <code>code<\/code> til denne Python-variabel.<\/li>\n<\/ul>\n<p><\/p>\n<p>Brug eksempel:<\/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>I dette eksempel multiplicerer vi 2 med 3 og gemmer resultatet i Python-variablen <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Overf\u00f8rsel af data<\/h2>\n<p><\/p>\n<p>Overf\u00f8r data til Python og tilbage.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Der er 4 m\u00e5der at f\u00e5 v\u00e6rdien af en Python-variabel i InterSystems IRIS, afh\u00e6ngigt af den serialisering, du har brug for:<\/p>\n<p><\/p>\n<ul>\n<li><code>Streng<\/code> til simple datatyper og debugging.<\/li>\n<li><code>Repr<\/code> til opbevaring af enkle objekter og debugging.<\/li>\n<li><code>JSON<\/code> til let manipulation af data p\u00e5 InterSystems IRIS siden.<\/li>\n<li><code>Pickle<\/code> til gemme objekter.<\/li>\n<\/ul>\n<p><\/p>\n<p>Disse metoder g\u00f8r det muligt at hente variabler fra Python som strenge eller streams.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 hent <code>serialization<\/code> variabel <code>variable<\/code> i <code>stream<\/code>. Hvis <code>useString<\/code> er lig med 1, og serialiseringen placeres i en streng, s\u00e5 returneres en streng og ikke en stream.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 hent JSON serialiseringen af variabel.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> - hent Pickle (eller Dill) serialiseringen af variabel.<\/li>\n<\/ul>\n<p><\/p>\n<p>Lad os pr\u00f8ve at hente vores variabel <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>Vi l\u00e6ser data fra InterSystems IRIS til Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 opretter et datas\u00e6t (pandas <code>dataframe<\/code> eller <code>list<\/code>) fra SQL-foresp\u00f8rgslen og s\u00e6tter det i Python-variabel. <code>variable<\/code>. Pakken <code>isc.py<\/code> skal v\u00e6re tilg\u00e6ngelig i dom\u00e6net <code>namespace<\/code> \u2014 der hvor foresp\u00f8rgslen vil blive udf\u00f8rt.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 indl\u00e6ser data fra globalen <code>global<\/code> fra delindekset <code>start<\/code> op til <code>end<\/code> til Python som en variabel af typen <code>type<\/code>: <code>list<\/code>, eller pandas <code>dataframe<\/code>. Beskrivelsen af de valgfrie argumenter <code>mask<\/code> og <code>labels<\/code> er tilg\u00e6ngelig i klassedokumentationen og i depotet <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 indl\u00e6ser data fra klassen <code>klasse<\/code> fra id <code>start<\/code> op til <code>end<\/code> til Python som en variabel af typen <code>type<\/code>: <code>list<\/code>, eller pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 en liste (adskilt af komma) af klasseegenskaber, som skal indl\u00e6ses i datas\u00e6ttet. Masker underst\u00f8ttes. <code>*<\/code> og <code>?<\/code>. Som standard \u2014 <code>*<\/code> (alle egenskaber). Egenskaben <code>%%CLASSNAME<\/code> ignoreres.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 indl\u00e6ser data fra tabellen <code>table<\/code> fra id <code>start<\/code> op til <code>end<\/code> til Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 er universel (enhver gyldig SQL-foresp\u00f8rgsel vil blive sendt til Python). Men, <code>ExecuteGlobal<\/code> og dens wrappers <code>ExecuteClass<\/code> og <code>ExecuteTable<\/code> har en r\u00e6kke begr\u00e6nsninger. De er meget hurtigere (3-5 gange hurtigere end ODBC-driveren og 20 gange hurtigere <code>ExecuteQuery<\/code>). Yderligere information i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<br \/>\nAlle disse metoder underst\u00f8tter dataoverf\u00f8rsel fra ethvert dom\u00e6ne. Pakken <code>isc.py<\/code> skal v\u00e6re tilg\u00e6ngelig i det m\u00e5lrettede dom\u00e6ne.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 overf\u00f8rsel af resultaterne af enhver gyldig SQL-foresp\u00f8rgsel til Python. Dette er den langsomste metode til dataoverf\u00f8rsel. Brug den, hvis <code>ExecuteGlobal<\/code> og dens wrappers ikke er tilg\u00e6ngelige.<\/p>\n<p><\/p>\n<p>Argumenter:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 SQL-foresp\u00f8rgsel.<\/li>\n<li><code>variable<\/code> \u2014 navnet p\u00e5 Python variablen, hvori dataene skrives.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> eller Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 dom\u00e6net, hvor foresp\u00f8rgslen vil blive udf\u00f8rt.<\/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 overf\u00f8rsel af globalen til Python.<\/p>\n<p><\/p>\n<p>Argumenter:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 navnet p\u00e5 globalen uden <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 navnet p\u00e5 Python variablen, hvori dataene skrives.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> eller Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 f\u00f8rste delindeks p\u00e5 globalen. Obligatorisk <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 sidste delindeks p\u00e5 globalen. Obligatorisk <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 masken for globale v\u00e6rdier. Masken kan v\u00e6re kortere end antallet af felter i globalen (i s\u00e5 fald vil felterne i slutningen blive udeladt). S\u00e5dan formatteres masken:\n<ul>\n<li><code>+<\/code> overf\u00f8r v\u00e6rdien som den er.<\/li>\n<li><code>-<\/code> spring v\u00e6rdien over.<\/li>\n<li><code>b<\/code> \u2014 Boolesk type (<code>0<\/code> \u2014 <code>False<\/code>, alt andet \u2014 <code>Sand<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Dato (fra $horolog, p\u00e5 Windows fra 1970, p\u00e5 Linux fra 1900).<\/li>\n<li><code>t<\/code> \u2014 Tid ($horolog, sekunder efter midnat).<\/li>\n<li><code>m<\/code> \u2014 Tidsstempel (streng i formatet \u00c5R-M\u00c5NED-DAG TIME:MINUT:SEKUND).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Liste af kolonne-navne. Det f\u00f8rste element \u2014 navnet p\u00e5 subscriptet.<\/li>\n<li><code>namespace<\/code> \u2014 dom\u00e6net, hvor foresp\u00f8rgslen vil blive udf\u00f8rt.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Wrapper over <code>ExecuteGlobal<\/code>. Baseret p\u00e5 klassedefinitionen forbereder den kaldet <code>ExecuteGlobal<\/code> og kalder det.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 overf\u00f8rsel af klassedata i Python.<\/p>\n<p><\/p>\n<p>Argumenter:<\/p>\n<p><\/p>\n<ul>\n<li><code>klasse<\/code> \u2014 klassens navn<\/li>\n<li><code>variable<\/code> \u2014 navnet p\u00e5 Python variablen, hvori dataene skrives.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> eller Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 start Id.<\/li>\n<li><code>end<\/code> \u2014 slut Id<\/li>\n<li><code>properties<\/code> \u2014 en liste (adskilt af komma) af klasseegenskaber, som skal indl\u00e6ses i datas\u00e6ttet. Masker underst\u00f8ttes. <code>*<\/code> og <code>?<\/code>. Som standard \u2014 <code>*<\/code> (alle egenskaber). Egenskaben <code>%%CLASSNAME<\/code> ignoreres.<\/li>\n<li><code>namespace<\/code> \u2014 dom\u00e6net, hvor foresp\u00f8rgslen vil blive udf\u00f8rt.<\/li>\n<\/ul>\n<p><\/p>\n<p>Alle egenskaber overf\u00f8res som de er, undtagen egenskaber for typer <code>te<\/code>, <code>%Tid<\/code>, <code>%Boolsk<\/code> og <code>%Tidsstempel<\/code> \u2014 de konverteres til de tilsvarende Python-klasser.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Wrapper over <code>ExecuteClass<\/code>. Translaterer tabelnavnet til klassens navn og kalder <code>ExecuteClass<\/code>. Signatur:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 overf\u00f8rsel af tabeldata i Python.<\/p>\n<p><\/p>\n<p>Argumenter:<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 tabelens navn.<br \/>\nAlle andre argumenter overf\u00f8res som de er til <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Noter<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> og <code>ExecuteTable<\/code> arbejder liges\u00e5 hurtigt.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 gange hurtigere end <code>ExecuteQuery<\/code> p\u00e5 store datas\u00e6t (overf\u00f8rselstid mere end &gt;0.01 sekunder).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> og <code>ExecuteTable<\/code> arbejder p\u00e5 globaler med denne struktur: <code>^global(n\u00f8gle) = $lb(prop1, prop2, ..., propN)<\/code> hvor <code>n\u00f8gle<\/code> \u2014 heltal.<\/li>\n<li>For <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> og <code>ExecuteTable<\/code> underst\u00f8ttet v\u00e6rdiramme <code>te<\/code> svarer til intervallet <code>mktime<\/code> og afh\u00e6nger af OS (<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>). Brug <code>%Tidsstempel<\/code>til at overf\u00f8re data uden for dette interval eller brug pandas dataframe, da dette er en begr\u00e6nsning kun for listen.<\/li>\n<li>For <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> og <code>ExecuteTable<\/code> alle argumenter undtagen datakilden (globalen, klassen eller tabellen) og variablen er valgfrie.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Eksempler<\/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> indeholder en metode, der demonstrerer alle muligheder for dataoverf\u00f8rsel:<\/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\/\/ Generelle argumenter\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ Metode 0: ExecuteGlobal uden argumenter\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ Metode 1: ExecuteGlobal med argumenter    \n\/\/ N\u00e5r man sender global, defineres feltnavnene manuelt\n\/\/ globalKey - navnet p\u00e5 subscriptet \nset labels = $lb(\"globalKey\", \"Name\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask indeholder 1 element mindre end labels fordi \"globalKey\" - navnet p\u00e5 subscriptet\n\/\/ Vi springer %%CLASSNAME over\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ Metode 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ Metode 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ Metode 4: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Kald metoden <code>do ##class(isc.py.test.Person).Test()<\/code> for at se, hvordan alle metoder til dataoverf\u00f8rsel fungerer.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Hj\u00e6lpefunktioner<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 f\u00e5 information om variablen: om den er defineret, dens klasse og l\u00e6ngden af serialisering.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 er variablen defineret.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 f\u00e5 klassens type for variablen.<\/li>\n<li><code>GetStatus()<\/code> \u2014 f\u00e5 og fjern den seneste undtagelse p\u00e5 Python-siden.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 f\u00e5 information om modulets variabel og importstatus.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 f\u00e5 information om funktionen.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilitet<\/h1>\n<p><\/p>\n<p>Du har l\u00e6rt at kalde Python Gateway fra terminalen, nu begynder vi at bruge det i produktion. Grundlaget for interaktionen med Python i denne tilstand er <code>isc.py.ens.Operation<\/code>. Det giver os mulighed for:<\/p>\n<p><\/p>\n<ul>\n<li>At udf\u00f8re kode i Python<\/li>\n<li>At gemme\/gendanne Python-konteksten<\/li>\n<li>At indl\u00e6se og hente data fra Python<\/li>\n<\/ul>\n<p><\/p>\n<p>I princippet er Python-operationen en indpakning over <code>isc.py.Main<\/code>. Operationen <code>isc.py.ens.Operation<\/code> muligg\u00f8r interaktion med Python-processen fra InterSystems IRIS-produkter. Fem foresp\u00f8rgsler underst\u00f8ttes:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> til at udf\u00f8re Python-koden. Returnerer <code>isc.py.msg.ExecutionResponse<\/code> med resultatet af udf\u00f8relsen og v\u00e6rdierne af de \u00f8nskede variabler.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> til at udf\u00f8re Python-koden. Returnerer <code>isc.py.msg.StreamExecutionResponse<\/code> resultatet af udf\u00f8relsen og v\u00e6rdierne af de \u00f8nskede variabler. Analog <code>isc.py.msg.ExecutionRequest<\/code>, men accepterer og returnerer streams i stedet for strenge.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> til at overf\u00f8re resultatet af SQL-foresp\u00f8rgslen. Returnerer <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> til at overf\u00f8re data til globaler\/klasse\/tabeller. Returnerer <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> til at gemme Python-konteksten. Returnerer <code>Ens.StringResponse<\/code> med konteksts-id.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> til at gendanne Python-konteksten.<\/p>\n<p><\/p>\n<p>Derudover, <code>isc.py.ens.Operation<\/code> har to indstillinger:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 valg af klasse, der implementerer interfacet <code>isc.py.init.Abstract<\/code>. Den kan bruges til at indl\u00e6se funktioner, moduler, klasser osv. Den udf\u00f8res \u00e9n gang ved opstart af processen.<\/li>\n<li><code>PythonLib<\/code> \u2014 (kun for Linux) hvis du ser fejl ved indl\u00e6sning, skal du s\u00e6tte den til <code>libpython3.6m.so<\/code> eller endda den fulde sti til Python-biblioteket. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Oprettelse af forretningsprocesser<\/h2>\n<p><\/p>\n<p>Der er to klasser, der g\u00f8r det lettere at udvikle forretningsprocesser:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> giver mulighed for at udtr\u00e6kke annotationer fra aktiviteter med variableudskiftning.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> g\u00f8r det nemt at teste forretningsprocesser med Python. Den kan udf\u00f8re forretningsprocessen (dele p\u00e5 Python-sprog) i den aktuelle proces.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Variabeludskiftning<\/h2>\n<p><\/p>\n<p>Alle forretningsprocesser, der er arvet fra <code>isc.py.ens.ProcessUtils<\/code>, kan bruge metoden <code>GetAnnotation(name)<\/code> til at f\u00e5 v\u00e6rdien af aktiviteten annotation efter dens navn. Aktivitetens annotation kan indeholde variable, som vil blive beregnet p\u00e5 InterSystems IRIS-siden, f\u00f8r de sendes til Python. Her er syntaksen for variabeludskiftning:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 kald metode<\/li>\n<li><code>#{expr}<\/code> \u2014 udf\u00f8re kode i ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Et eksempel er tilg\u00e6ngeligt i testforretningsprocessen <code>isc.py.test.Process<\/code>, for eksempel i aktiviteten <code>Korrelationsmatrix: Grafik<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. I dette eksempel:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> returnerer egenskaben WorkDirectory for objektet <code>process<\/code>, som er en instans af klassen <code>isc.py.test.Process<\/code> dvs. den aktuelle forretningsproces.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> trykkes, kaldes metoden <code>Integer<\/code> klassen <code>%PopulateUtils<\/code>, ved at sende argumenter <code>1<\/code> og <code>100<\/code>, returnerer et tilf\u00e6ldigt heltal i intervallet <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Testforretningsprocessen<\/h2>\n<p><\/p>\n<p>Testprodukter og testforretningsprocessen er tilg\u00e6ngelige som standard som en del af Python Gateway. For at bruge dem:<\/p>\n<p><\/p>\n<ol>\n<li>Udf\u00f8r i OS-terminalen: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>Udf\u00f8r i InterSystems IRIS-terminalen: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> for at udfylde testdata.<\/li>\n<li>Start produktet <code>isc.py.test.Production<\/code>.<\/li>\n<li>Send en foresp\u00f8rgsel af typen <code>Ens.Request<\/code> i <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Lad os se, hvordan det hele fungerer sammen. \u00c5bn <code>isc.py.test.Process<\/code> i BPL-editoren:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i 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\">Udf\u00f8relse af kode<\/h3>\n<p><\/p>\n<p>Den vigtigste kald er udf\u00f8relsen af Python-koden:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bruger foresp\u00f8rgslen <code>isc.py.msg.ExecutionRequest<\/code>, her er dens egenskaber:<\/p>\n<p><\/p>\n<ul>\n<li><code>Kode<\/code> \u2014 Python-kode.<\/li>\n<li><code>SeparateLines<\/code> \u2014 om koden skal opdeles i linjer til udf\u00f8relse. <code>$c(10)<\/code> (<code>n<\/code>) bruges til at adskille linjer. Bem\u00e6rk, at det ikke anbefales at behandle beskeden helt p\u00e5 \u00e9n gang; denne funktion er kun beregnet til behandling <code>def<\/code> og lignende flerlinjede udtryk. Som standard <code>0<\/code>.<\/li>\n<li><code>Variabler<\/code> \u2014 en kommasepareret liste af variabler, der vil blive tilf\u00f8jet til svaret.<\/li>\n<li><code>Serialization<\/code> \u2014 Hvordan man serialiserer de variabler, vi \u00f8nsker at returnere. Muligheder: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> og <code>Dill<\/code>, som standard <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>I vores tilf\u00e6lde indstiller vi kun egenskaben <code>Kode<\/code>, s\u00e5 alle andre egenskaber bruger standardv\u00e6rdier. Vi indstiller den ved at kalde <code>process.GetAnnotation(\"Import pandas\")<\/code>, som under udf\u00f8relsen returnerer annotationen efter udf\u00f8relsen af variabel substitution. Til sidst vil koden <code>import pandas as pd<\/code> blive sendt til Python. <code>GetAnnotation<\/code> kan v\u00e6re nyttig til at hente flerlinjede Python-scripts, men der er ingen begr\u00e6nsninger for denne metode til at hente koden. Du kan indstille egenskaben <code>Kode<\/code> p\u00e5 enhver m\u00e5de, der er behagelig for dig.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Hentning af variabler<\/h3>\n<p><\/p>\n<p>Endnu et interessant kald ved hj\u00e6lp af <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Korrelationsmatrix: Tabellarisk<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den beregner korrelationsmatrixen p\u00e5 Python-siden og tr\u00e6kker variablen <code>corrmat<\/code> tilbage til InterSystems IRIS i JSON-format ved at indstille foresp\u00f8rgselsegenskaber:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabler<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serialization<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Vi kan se resultaterne i Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og hvis vi har brug for denne v\u00e6rdi i BP, kan den hentes s\u00e5dan: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Overf\u00f8rsel af data<\/h3>\n<p><\/p>\n<p>Lad os derefter tale om at overf\u00f8re data fra InterSystems IRIS til Python; alle dataoverf\u00f8rselsanmodninger implementerer interface <code>isc.py.msg.DataRequest<\/code>, som tilbyder f\u00f8lgende egenskaber:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variable<\/code> \u2014 Python-variablen hvor dataene skrives.<\/li>\n<li><code>Type<\/code> \u2014 typen af variablen: <code>dataframe<\/code> (pandas dataframe) eller <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 omr\u00e5det fra hvilket vi henter data. Pakken <code>isc.py<\/code> skal v\u00e6re tilg\u00e6ngelig i dette omr\u00e5de. Dette kan v\u00e6re et omr\u00e5de uden produktsupport.<\/li>\n<\/ul>\n<p><\/p>\n<p>Baseret p\u00e5 dette interface er der implementeret 4 klasser af anmodninger:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 s\u00e6t din egenskab <code>Query<\/code> til at overf\u00f8re SQL-anmodningen.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 s\u00e6t din egenskab <code>Class<\/code> til at overf\u00f8re klassedata.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 s\u00e6t din egenskab <code>Table<\/code> til at overf\u00f8re tabeldata.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 s\u00e6t din egenskab <code>Global<\/code> til at overf\u00f8re globaledata.<\/li>\n<\/ul>\n<p><\/p>\n<p>I testprocessen, se aktiviteten <code>RAW<\/code>, hvor <code>isc.py.msg.QueryRequest<\/code> vist i aktion.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i 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\">Gem\/restituer Python-konteksten<\/h3>\n<p><\/p>\n<p>Endelig kan vi gemme Python-konteksten i InterSystems IRIS; for at g\u00f8re dette sender vi <code>isc.py.msg.SaveRequest<\/code> med argumenterne:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2014 Kun variabler, der tilfredsstiller masken, gemmes. Underst\u00f8ttede <code>*<\/code> og <code>?<\/code>. Eksempel: <code>\"Data*, Figur?\"<\/code>. Som standard <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Den maksimale l\u00e6ngde af den gemte variabel. Hvis serialiseringen af variablen overstiger denne l\u00e6ngde, ignoreres den. S\u00e6t 0 for at for at f\u00e5 variabler i enhver l\u00e6ngde. Som standard <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Navn<\/code> \u2014 Navn p\u00e5 konteksten (valgfrit).<\/li>\n<li><code>Beskrivelse<\/code> \u2014 Beskrivelse af konteksten (valgfrit).<\/li>\n<\/ul>\n<p><\/p>\n<p>Returnerer <code>Ens.StringResponse<\/code> med <code>Id<\/code> den gemte kontekst. I testprocessen kan du se aktiviteten <code>Gem kontekst<\/code>.<\/p>\n<p><\/p>\n<p>Den relevante anmodning <code>isc.py.msg.RestoreRequest<\/code> loader konteksten fra InterSystems IRIS til Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 kontekstens identifikator.<\/li>\n<li><code>Ryd<\/code> \u2014 ryd konteksten f\u00f8r genoprettelse.<\/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 er en webapplikation med \u00e5bent kildekode, der g\u00f8r det muligt at oprette notebooks indeholdende kode, visualiseringer og tekst og offentligg\u00f8re dem. Python Gateway giver mulighed for at se og redigere BPL-processer som Jupyter Notebook. Bem\u00e6rk, at den nuv\u00e6rende version bruger Python 3 som standard executor.<\/p>\n<p><\/p>\n<p>Denne udvidelse foruds\u00e6tter, at annotationerne indeholder Python-kode og bruger aktivitetsnavne som overordnede overskrifter. Det er nu muligt at udvikle business processer PythonGateway i Jupyter Notebook. Her er hvad der er muligt: <\/p>\n<p><\/p>\n<ul>\n<li>Oprette nye forretningsprocesser<\/li>\n<li>Slette forretningsprocesser<\/li>\n<li>Oprette nye aktiviteter<\/li>\n<li>\u00c6ndre aktiviteter<\/li>\n<li>Slette aktiviteter<\/li>\n<\/ul>\n<p><\/p>\n<p>Her er <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">demonstrationsvideo<\/a><\/noindex>. Og nogle sk\u00e6rmbilleder:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Procesudforsker<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i 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\">Procesredigerer<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway i 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>Du skal have InterSystems IRIS 2019.2+.<\/li>\n<li>Installer PythonGateway v0.8+ (kr\u00e6ver kun <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> og <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Opdater ObjectScript-koden fra lageret.<\/li>\n<li>K\u00f8r <code>do ##class(isc.py.util.Jupyter).Install()<\/code> og f\u00f8lg instruktionerne.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Dokumentation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Konklusioner<\/h1>\n<p><\/p>\n<p>MLToolkit er et v\u00e6rkt\u00f8jss\u00e6t, hvis m\u00e5l er at integrere modeller og transaktionelle milj\u00f8er, s\u00e5 de opbyggede modeller nemt kan bruges direkte i dine forretningsprocesser. Python Gateway er en del af MLToolkit og muligg\u00f8r integration med Python-sproget og g\u00f8r det muligt at orkestrere enhver maskinl\u00e6ringsalgoritme lavet i Python (den prim\u00e6re platform for mange dataforskere), samt at bruge mange forudbyggede biblioteker til hurtigt at udvikle adaptive, automatiserede analytiske AI\/ML-l\u00f8sninger p\u00e5 InterSystems IRIS-platformen.<\/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\/\">The previous article<\/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 Eksempler<\/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\">Dokumentation og kurser i Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>MLToolkit-brugergruppen er et privat GitHub-repositorium, oprettet som en del af Den Corporate GitHub-organisation InterSystems. Den henvender sig til eksterne brugere, der installerer, unders\u00f8ger eller allerede bruger komponenter fra MLToolkit, herunder Python Gateway. Gruppen tilbyder en r\u00e6kke implementerede use cases (med kildekode og testdata) inden for marketing, produktion, medicin og mange andre omr\u00e5der. For at deltage i ML Toolkit-brugergruppen bedes du sende en kort e-mail til f\u00f8lgende adresse: <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> og angiv f\u00f8lgende oplysninger i din e-mail:<\/p>\n<p><\/p>\n<ul>\n<li>GitHub-brugernavn<\/li>\n<li>Organisation (hvor du arbejder eller studerer)<\/li>\n<li>Stilling (din faktiske stilling i din organisation, eller \"Studerende\", eller \"Selvst\u00e6ndig\").<\/li>\n<li>Land<\/li>\n<\/ul>\n<p><\/p>\n<p>Til dem, der har l\u00e6st artiklen og er interesseret i mulighederne med InterSystems IRIS som platform for udvikling eller hosting af AI- og maskinl\u00e6ringsmekanismer, tilbyder vi at dr\u00f8fte mulige scenarier af interesse for din virksomhed. Vi vil gerne analysere dine virksomheders behov og sammen definere en handlingsplan; kontakt e-mailadressen til vores AI\/ML ekspertteam er <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/486984\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":41222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-41221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 i InterSystems IRIS | ProHoster","description":"Denne artikel handler om Python Gateway \u2014 et f\u00e6llesskabsprojekt med \u00e5bent kildekode til dataplatformen InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}