{"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\/sv\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway i InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Den h\u00e4r artikeln handlar om Python Gateway \u2014 ett community-projekt med \u00f6ppen k\u00e4llkod f\u00f6r InterSystems IRIS dataplattform. Detta projekt m\u00f6jligg\u00f6r orkestrering av alla maskininl\u00e4rningsalgoritmer som skapats i Python (den prim\u00e4ra milj\u00f6n f\u00f6r m\u00e5nga datavetare), och att anv\u00e4nda ett flertal f\u00e4rdiga bibliotek f\u00f6r att snabbt skapa anpassningsbara, robotiserade analytiska AI\/ML-l\u00f6sningar p\u00e5 InterSystems IRIS-plattformen. I den h\u00e4r artikeln kommer jag att visa hur InterSystems IRIS kan orkestrera processer p\u00e5 Python, effektivt genomf\u00f6ra tv\u00e5v\u00e4gsdata\u00f6verf\u00f6ring och skapa intelligenta aff\u00e4rsprocesser.<\/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>Verktyg.<\/li>\n<li>Installation.<\/li>\n<li>API.<\/li>\n<li>Interoperabilitet.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Slutsatser.<\/li>\n<li>L\u00e4nkar.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introduktion<\/h1>\n<p><\/p>\n<p>Python \u00e4r ett h\u00f6g-niv\u00e5 programmeringsspr\u00e5k f\u00f6r allm\u00e4nna \u00e4ndam\u00e5l som fokuserar p\u00e5 att \u00f6ka utvecklarens produktivitet och kodens l\u00e4sbarhet. I denna artikelserie kommer jag att diskutera m\u00f6jligheterna att anv\u00e4nda Python p\u00e5 InterSystems IRIS-plattformen, d\u00e4r huvudfokus f\u00f6r denna artikel \u00e4r att anv\u00e4nda Python f\u00f6r att skapa och till\u00e4mpa maskininl\u00e4rningsmodeller.<\/p>\n<p><\/p>\n<p>Maskininl\u00e4rning (ML) \u00e4r en klass av metoder inom artificiell intelligens, vars k\u00e4nnetecken \u00e4r att de inte l\u00f6ser problem direkt utan l\u00e4r sig genom att l\u00f6sa ett antal liknande problem. <\/p>\n<p><\/p>\n<p>Algoritmer och modeller f\u00f6r maskininl\u00e4rning blir alltmer vanliga. Anledningarna till detta \u00e4r m\u00e5nga, men allt handlar om tillg\u00e4nglighet, enkelhet och att uppn\u00e5 praktiska resultat. \u00c4r klustring eller till och med neuron\u00e4r n\u00e4tverksmodellering en ny teknologi? <\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart inte, men idag \u00e4r det inte n\u00f6dv\u00e4ndigt att skriva hundratusentals rader kod f\u00f6r att k\u00f6ra en modell, och kostnaderna f\u00f6r att skapa och till\u00e4mpa modeller blir allt l\u00e4gre.<\/p>\n<p><\/p>\n<p>Verktygen utvecklas \u2014 \u00e4ven om vi inte har helt GUI-orienterade AI\/ML-verktyg, s\u00e5 ser vi samma framsteg som vi har sett inom m\u00e5nga andra klasser av informationssystem, till exempel BI (fr\u00e5n kodskrivning till anv\u00e4ndning av ramverk och GUI-orienterade konfigurerbara l\u00f6sningar), \u00e4ven i verktyg f\u00f6r att skapa AI\/ML. Vi har redan passerat fasen av att skriva kod och anv\u00e4nder idag ramverk f\u00f6r att bygga och tr\u00e4na modeller.<\/p>\n<p><\/p>\n<p>Andra f\u00f6rb\u00e4ttringar, som m\u00f6jligheten att sprida en f\u00f6rutbildad modell, d\u00e4r slutanv\u00e4ndaren bara m\u00e5ste slutf\u00f6ra tr\u00e4ningen av modellen med sina specifika data, underl\u00e4ttar ocks\u00e5 b\u00f6rjan av till\u00e4mpningen av maskininl\u00e4rning. Dessa framsteg g\u00f6r det betydligt l\u00e4ttare att l\u00e4ra sig maskininl\u00e4rning, b\u00e5de f\u00f6r specialister och f\u00f6r f\u00f6retag som helhet.<\/p>\n<p><\/p>\n<p>\u00c5 andra sidan samlar vi in \u200b\u200ballt mer data. Tack vare en enhetlig dataplattform, s\u00e5som InterSystems IRIS, kan all denna information omedelbart f\u00f6rberedas och anv\u00e4ndas som grunddata f\u00f6r maskininl\u00e4rningsmodeller.<\/p>\n<p><\/p>\n<p>Med \u00f6verg\u00e5ngen till molnet blir lanseringen av AI\/ML-projekt l\u00e4ttare \u00e4n n\u00e5gonsin. Vi kan anv\u00e4nda endast de resurser som vi beh\u00f6ver. Dessutom, tack vare parallelliseringen som erbjuds av molnplattformar, kan vi spara tid.<\/p>\n<p><\/p>\n<p>Men hur \u00e4r det med resultaten? H\u00e4r blir allt mer komplicerat. Det finns m\u00e5nga verktyg f\u00f6r att bygga modeller, vilket jag kommer att g\u00e5 in p\u00e5 senare. Att bygga en bra modell \u00e4r inte enkelt, men vad h\u00e4nder sen? Att f\u00e5 f\u00f6retagets verksamhet att dra nytta av modellen \u00e4r ocks\u00e5 en utmanande uppgift. K\u00e4rnan i problemet ligger i att separera analytiska och transaktionella belastningar, samt datamodeller. N\u00e4r vi tr\u00e4nar en modell g\u00f6r vi det vanligtvis p\u00e5 historiska data. Men platsen f\u00f6r den byggda modellen \u00e4r i den transaktionella databehandlingen. Vad \u00e4r po\u00e4ngen med den b\u00e4sta modellen f\u00f6r att uppt\u00e4cka bedr\u00e4gliga transaktioner, om vi bara k\u00f6r den en g\u00e5ng om dagen? Bedragarna har redan f\u00f6rsvunnit med pengarna. Vi beh\u00f6ver tr\u00e4na modellen p\u00e5 historiska data, men vi m\u00e5ste ocks\u00e5 till\u00e4mpa den i realtid p\u00e5 de nya inkommande data s\u00e5 att v\u00e5ra aff\u00e4rsprocesser kan agera i enlighet med de f\u00f6ruts\u00e4gelser som modellen g\u00f6r.<\/p>\n<p><\/p>\n<p>ML Toolkit \u00e4r en upps\u00e4ttning verktyg vars syfte \u00e4r just detta: att f\u00f6rena modeller och transaktionsmilj\u00f6er s\u00e5 att byggda modeller enkelt kan anv\u00e4ndas direkt i dina aff\u00e4rsprocesser. Python Gateway \u00e4r en del av ML Toolkit och m\u00f6jligg\u00f6r integration med Python-spr\u00e5ket (p\u00e5 samma s\u00e4tt som R Gateway, som \u00e4r en del av ML Toolkit, m\u00f6jligg\u00f6r integration med R-spr\u00e5ket).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Verktygsl\u00e5da<\/h1>\n<p><\/p>\n<p>Innan vi forts\u00e4tter, skulle jag vilja beskriva n\u00e5gra verktyg och bibliotek f\u00f6r Python som vi kommer att anv\u00e4nda senare.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Teknologier<\/h2>\n<p><\/p>\n<ul>\n<li>Python \u00e4r ett tolkat, h\u00f6g-niv\u00e5 programmeringsspr\u00e5k f\u00f6r allm\u00e4n anv\u00e4ndning. Den fr\u00e4msta f\u00f6rdelen med spr\u00e5ket \u00e4r det stora biblioteket av matematiska, ML- och AI-bibliotek. Precis som ObjectScript \u00e4r det ett objektorienterat spr\u00e5k, men allt definieras dynamiskt snarare \u00e4n statiskt. Dessutom \u00e4r allt ett objekt. Senare artiklar f\u00f6ruts\u00e4tter ett flyktigt bekantskap med spr\u00e5ket. Om du vill b\u00f6rja l\u00e4ra dig rekommenderar jag att du b\u00f6rjar med <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">dokumentationen<\/a><\/noindex>.<\/li>\n<li>F\u00f6r v\u00e5ra kommande \u00f6vningar, installera <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: Jag anv\u00e4nder <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, men det finns ocks\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">m\u00e4n<\/a><\/noindex>. Om du anv\u00e4nder Atelier finns det en Eclipse-plugin f\u00f6r Python-utvecklare. Om du anv\u00e4nder VS Code, finns det en extension f\u00f6r Python. <\/li>\n<li>Notebook: ist\u00e4llet f\u00f6r en IDE kan du skriva och dela dina skript i online-notebooks. Den mest popul\u00e4ra \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Bibliotek<\/h2>\n<p><\/p>\n<p>H\u00e4r \u00e4r en (ofullst\u00e4ndig) lista \u00f6ver bibliotek f\u00f6r maskininl\u00e4rning:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 det grundl\u00e4ggande paketet f\u00f6r exakta ber\u00e4kningar.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 h\u00f6gpresterande datatyper och verktyg f\u00f6r dataanalys.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 skapande av grafer.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 datavisualisering baserat p\u00e5 matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 maskininl\u00e4rningsmetoder.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 maskininl\u00e4rningsalgoritmer inom ramen f\u00f6r metodologin f\u00f6r gradientboosting.<\/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 neurala n\u00e4tverk.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 en plattform f\u00f6r att bygga maskininl\u00e4rningsmodeller.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 en plattform f\u00f6r att bygga maskininl\u00e4rningsmodeller med fokus p\u00e5 Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML fr\u00e5n olika modeller.<\/li>\n<\/ul>\n<p><\/p>\n<p>AI\/ML-teknologier m\u00f6jligg\u00f6r att f\u00f6retag blir mer effektiva och anpassningsbara. Dessutom blir dessa teknologier idag enklare att utveckla och implementera. B\u00f6rja studera AI\/ML-teknologier och hur de kan hj\u00e4lpa din organisation att v\u00e4xa.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Installation<\/h1>\n<p><\/p>\n<p>Det finns flera s\u00e4tt att installera och anv\u00e4nda Python Gateway:<\/p>\n<p><\/p>\n<ul>\n<li>OS\n<ul>\n<li>Windows<\/li>\n<li>Linux<\/li>\n<li>Mac<\/li>\n<\/ul>\n<\/li>\n<li>Docker\n<ul>\n<li>Anv\u00e4nd en bild fr\u00e5n DockerHub<\/li>\n<li>Skapa din egen bild<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Oavsett installationsmetod kommer du att beh\u00f6va k\u00e4llkoden. Den enda platsen f\u00f6r att ladda ner koden \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">versionssidan<\/a><\/noindex>. Den inneh\u00e5ller testade stabila utg\u00e5vor, ta bara den senaste. Just nu \u00e4r det 0.8, men fler kommer med tiden. Klona inte\/ladda inte ner repository, ladda ner bara den senaste utg\u00e5van.<\/p>\n<p><\/p>\n<h2 id=\"os\">OS<\/h2>\n<p><\/p>\n<p>N\u00e4r du installerar Python Gateway p\u00e5 ett operativsystem m\u00e5ste du f\u00f6rst (oavsett operativsystem) installera Python. F\u00f6r att g\u00f6ra detta:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Installera Python 3.6.7 64 bit<\/a><\/noindex>. Det rekommenderas att installera Python i standardkatalogen.<\/li>\n<li>Installera modulen <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Ladda ner ObjectScript-koden (dvs. <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\", , 1)<\/code>) till valfritt namnutrymme med produkter. Om du vill att ett befintligt namnutrymme ska st\u00f6dja produkter, k\u00f6r: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Placera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> till mappen <code>bin<\/code> din instans av InterSystems IRIS. Biblioteksfilen m\u00e5ste vara tillg\u00e4nglig p\u00e5 en v\u00e4g som \u00e5terges av <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>Se till att milj\u00f6variabeln <code>PYTHONHOME<\/code> pekar p\u00e5 Python 3.6.7.<\/li>\n<li>Kontrollera att systemets milj\u00f6variabler <code>PATH<\/code> inneh\u00e5ller variabeln <code>PYTHONHOME<\/code> (eller katalogen som den pekar p\u00e5).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Kontrollera att milj\u00f6variabeln <code>PATH<\/code> inneh\u00e5ller <code>\/usr\/lib<\/code> och <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Anv\u00e4nd filen <code>\/etc\/environment<\/code> f\u00f6r att st\u00e4lla in milj\u00f6variabler.<\/li>\n<li>Vid fel <code>undefined symbol: _Py_TrueStruct<\/code> st\u00e4ll in inst\u00e4llningen <code>PythonLib<\/code>. Det finns ocks\u00e5 en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> som har en avsnitt om fels\u00f6kning.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>F\u00f6r n\u00e4rvarande st\u00f6ds bara Python 3.6.7 fr\u00e5n <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Kontrollera variabeln <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Om du har \u00e4ndrat milj\u00f6variabler, starta om din InterSystems-produkt.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>Anv\u00e4ndning av containrar har flera f\u00f6rdelar: <\/p>\n<p><\/p>\n<ul>\n<li>Portabilitet<\/li>\n<li>Effektivitet<\/li>\n<li>Isolering<\/li>\n<li>L\u00e4ttviktighet<\/li>\n<li>Immutabilitet<\/li>\n<\/ul>\n<p><\/p>\n<p>L\u00e4s denna <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">serie artiklar<\/a><\/noindex> f\u00f6r mer information om att anv\u00e4nda Docker med InterSystems-produkter. <\/p>\n<p><\/p>\n<p>Alla versioner av Python Gateway \u00e4r f\u00f6r n\u00e4rvarande baserade p\u00e5 containrar. <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">F\u00e4rdig bild<\/h3>\n<p><\/p>\n<p>K\u00f6r: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, f\u00f6r att ladda ner och k\u00f6ra Python Gateway med InterSystems IRIS Community Edition. Det \u00e4r allt.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Skapa din egen bild<\/h3>\n<p><\/p>\n<p>F\u00f6r att bygga dockerbilden k\u00f6r du i rotkatalogen f\u00f6r repositoriet: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nStandardbilden byggs baserat p\u00e5 bilden <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, men du kan \u00e4ndra detta genom att st\u00e4lla in variabeln <code>IMAGE<\/code>.<br \/>\nF\u00f6r att bygga fr\u00e5n InterSystems IRIS k\u00f6r: `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>Efter detta kan du k\u00f6ra dockerbilden:<\/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>Om du anv\u00e4nder en bild baserad p\u00e5 InterSystems IRIS Community Edition, beh\u00f6ver du inte ange nyckeln.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Kommentarer<\/h3>\n<p><\/p>\n<ul>\n<li>Testprocessen <code>isc.py.test.Process<\/code> sparar en rad bilder i en tempor\u00e4r katalog. Du kan vilja \u00e4ndra denna s\u00f6kv\u00e4g till en monterad katalog. F\u00f6r att g\u00f6ra detta, redigera inst\u00e4llningen <code>WorkingDir<\/code> genom att ange den monterade katalogen.<\/li>\n<li>F\u00f6r att f\u00e5 tillg\u00e5ng till terminalen, k\u00f6r: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>\u00c5tkomst till System Management Portal med inloggning <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>F\u00f6r att stoppa containern, k\u00f6r: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Verifiera installationen<\/h2>\n<p><\/p>\n<p>Efter att du har installerat Python Gateway, b\u00f6r du kontrollera att den fungerar. K\u00f6r denna kod i terminalen f\u00f6r 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>Det b\u00f6r resultera i <code>HELLO<\/code> \u2014 v\u00e4rdet p\u00e5 Python-variabeln <code>x<\/code>. Om den returnerade statusen <code>sc<\/code> \u00e4r ett fel eller <code>var<\/code> tom, kontrollera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 avsnitt f\u00f6r fels\u00f6kning<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway \u00e4r installerad och du har verifierat att den fungerar. Dags att b\u00f6rja anv\u00e4nda den!<br \/>\nHuvudgr\u00e4nssnittet f\u00f6r Python \u00e4r <code>isc.py.Main<\/code>. Det erbjuder f\u00f6ljande grupper av metoder (alla returnerar <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f6rning av kod<\/li>\n<li>Datatransmission<\/li>\n<li>Hj\u00e4lpmetoder<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">K\u00f6rning av kod<\/h2>\n<p><\/p>\n<p>Dessa metoder m\u00f6jligg\u00f6r k\u00f6rning av godtycklig Python-kod.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 \u00e4r den prim\u00e4ra metoden. Den tar 4 valfria argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 kodstr\u00e4ng att k\u00f6ra. Radbrytning: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 namnet p\u00e5 variabeln som ska returneras.<\/li>\n<li><code>serialization<\/code> \u2014 hur du ska seriellisera <code>returnVariable<\/code>. 0 \u2014 string (standard), 1 \u2014 repr.<\/li>\n<li><code>result<\/code> \u2014 ByRef-referens till variabeln d\u00e4r v\u00e4rdet skrivs. <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ovanf\u00f6r har vi k\u00f6rt:<\/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 detta exempel tilldelar vi en Python-variabel <code>x<\/code> v\u00e4rdet <code>Hej<\/code> och vill returnera v\u00e4rdet p\u00e5 Python-variabeln <code>x<\/code> till en ObjectScript-variabel <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode \u00e4r ett mer s\u00e4kert och mindre begr\u00e4nsat alternativ <code>SimpleString<\/code>.<br \/>\nStr\u00e4ngar p\u00e5 InterSystems IRIS-plattformen \u00e4r begr\u00e4nsade till 3 641 144 tecken, och om du vill k\u00f6ra en l\u00e4ngre kodsnutt, m\u00e5ste du anv\u00e4nda fl\u00f6den.<br \/>\nTar tv\u00e5 argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 str\u00e4ng eller fl\u00f6de av Python-kod att k\u00f6ra.<\/li>\n<li><code>variable<\/code> \u2014 (valfritt) tilldelar resultatet av k\u00f6rningen <code>code<\/code> denna Python-variabel.<\/li>\n<\/ul>\n<p><\/p>\n<p>Exempel att anv\u00e4nda:<\/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 detta exempel multiplicerar vi 2 med 3 och lagrar resultatet i en Python-variabel <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Datatransmission<\/h2>\n<p><\/p>\n<p>Skicka data till Python och tillbaka.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Det finns 4 s\u00e4tt att f\u00e5 v\u00e4rdet p\u00e5 en Python-variabel i InterSystems IRIS, beroende p\u00e5 vilken serialisering du beh\u00f6ver:<\/p>\n<p><\/p>\n<ul>\n<li><code>Str\u00e4ng<\/code> f\u00f6r enkla datatyper och fels\u00f6kning.<\/li>\n<li><code>Repr<\/code> f\u00f6r att lagra enkla objekt och f\u00f6r fels\u00f6kning.<\/li>\n<li><code>JSON<\/code> f\u00f6r att enkelt manipulera data p\u00e5 InterSystems IRIS-sidan.<\/li>\n<li><code>Pickle<\/code> f\u00f6r att spara objekt.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dessa metoder g\u00f6r det m\u00f6jligt att h\u00e4mta variabler fr\u00e5n Python som str\u00e4ngar eller fl\u00f6den.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 h\u00e4mta <code>serialization<\/code> variabeln <code>variable<\/code> p\u00e5 <code>stream<\/code>. Om <code>useString<\/code> \u00e4r 1 och serialisering placeras i en str\u00e4ng, s\u00e5 returneras en str\u00e4ng ist\u00e4llet f\u00f6r ett fl\u00f6de.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 h\u00e4mta JSON-serialisering av variabeln.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 h\u00e4mta Pickle (eller Dill) serialisering av variabeln.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi ska f\u00f6rs\u00f6ka h\u00e4mta v\u00e5r 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 laddar data fr\u00e5n InterSystems IRIS till Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 skapar en dataset (pandas <code>dataframe<\/code> eller <code>list<\/code>) fr\u00e5n SQL-f\u00f6rfr\u00e5gan och s\u00e4tter den i Python-variabeln <code>variable<\/code>. Paketet <code>isc.py<\/code> m\u00e5ste vara tillg\u00e4ngligt i omr\u00e5det <code>namnrymd<\/code> \u2014 d\u00e4r fr\u00e5gan kommer att utf\u00f6ras.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 laddar data fr\u00e5n globalen <code>global<\/code> fr\u00e5n subscriptet <code>start<\/code> till <code>end<\/code> till Python som en variabel av typen <code>typ<\/code>: <code>list<\/code>, eller pandas <code>dataframe<\/code>. Beskrivning av valfria argument <code>mask<\/code> och <code>labels<\/code> finns i dokumentationen f\u00f6r klassen och i f\u00f6rvaret <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 laddar klassdata <code>klass<\/code> fr\u00e5n id <code>start<\/code> till <code>end<\/code> till Python som en variabel av typen <code>typ<\/code>: <code>list<\/code>, eller pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 lista (separator \u2014 kommatecken) av klassens egenskaper som ska laddas in i datasetet. Masker st\u00f6ds <code>*<\/code> och <code>?<\/code>. Som standard \u2014 <code>*<\/code> (alla egenskaper). Egenskapen <code>%%CLASSNAME<\/code> \u00e4r inst\u00e4lld.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 laddar tabelldata <code>tabell<\/code> fr\u00e5n id <code>start<\/code> till <code>end<\/code> in i Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 \u00e4r universell (vilken som helst korrekt SQL-f\u00f6rfr\u00e5gan kommer att skickas till Python). Men, <code>ExecuteGlobal<\/code> och dess omslag <code>ExecuteClass<\/code> och <code>ExecuteTable<\/code> har vissa begr\u00e4nsningar. De \u00e4r mycket snabbare (3-5 g\u00e5nger snabbare \u00e4n ODBC-drivrutinen och 20 g\u00e5nger snabbare <code>ExecuteQuery<\/code>). Ytterligare information finns i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<br \/>\nAlla dessa metoder st\u00f6der datatransfer fr\u00e5n vilket omr\u00e5de som helst. Paketet <code>isc.py<\/code> m\u00e5ste vara tillg\u00e4ngligt i m\u00e5lomr\u00e5det.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 \u00f6verf\u00f6r resultat av vilken korrekt SQL-f\u00f6rfr\u00e5gan till Python. Detta \u00e4r den l\u00e5ngsammaste metoden f\u00f6r datatransfer. Anv\u00e4nd den om <code>ExecuteGlobal<\/code> och dess omslag inte \u00e4r tillg\u00e4ngliga.<\/p>\n<p><\/p>\n<p>Argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 SQL-f\u00f6rfr\u00e5gan.<\/li>\n<li><code>variable<\/code> \u2014 namnet p\u00e5 Python-variabeln d\u00e4r data sparas.<\/li>\n<li><code>typ<\/code> \u2014 <code>list<\/code> eller Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namnrymd<\/code> \u2014 omr\u00e5det d\u00e4r fr\u00e5gan kommer att utf\u00f6ras.<\/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 \u00f6verf\u00f6r globalen till Python.<\/p>\n<p><\/p>\n<p>Argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 namnet p\u00e5 globalen utan <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 namnet p\u00e5 Python-variabeln d\u00e4r data sparas.<\/li>\n<li><code>typ<\/code> \u2014 <code>list<\/code> eller Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 f\u00f6rsta subscriptet av globalen. Obligatoriskt <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 sista subscriptet av globalen. Obligatoriskt <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 mask av globala v\u00e4rden. Masken kan vara kortare \u00e4n antalet f\u00e4lt i globalen (i s\u00e5 fall kommer f\u00e4lten i slutet att ignoreras). S\u00e5 h\u00e4r formaterar du masken:\n<ul>\n<li><code>+<\/code> skicka v\u00e4rdet som det \u00e4r.<\/li>\n<li><code>-<\/code> hoppa \u00f6ver v\u00e4rdet.<\/li>\n<li><code>b<\/code> \u2014 Logisk typ (<code>0<\/code> \u2014 <code>Falskt<\/code>, allt annat \u2014 <code>Sant<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Datum (fr\u00e5n $horolog, p\u00e5 Windows fr\u00e5n 1970, p\u00e5 Linux fr\u00e5n 1900).<\/li>\n<li><code>t<\/code> \u2014 Tid ($horolog, sekunder efter midnatt).<\/li>\n<li><code>m<\/code> \u2014 Tidsst\u00e4mpel (str\u00e4ng i formatet \u00c5R-M\u00c5NAD-DAG TIMME:MINUT:SEKUND).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %List \u00f6ver kolumnnamn. F\u00f6rsta elementet \u2014 namnet p\u00e5 subscriptet.<\/li>\n<li><code>namnrymd<\/code> \u2014 omr\u00e5det d\u00e4r fr\u00e5gan kommer att utf\u00f6ras.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Inpackning \u00f6ver <code>ExecuteGlobal<\/code>. Baserat p\u00e5 klassdefinitionen f\u00f6rbereder den ett anrop <code>ExecuteGlobal<\/code> och anropar det.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 \u00f6verf\u00f6ring av klassdata i Python.<\/p>\n<p><\/p>\n<p>Argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>klass<\/code> \u2014 klassnamn<\/li>\n<li><code>variable<\/code> \u2014 namnet p\u00e5 Python-variabeln d\u00e4r data sparas.<\/li>\n<li><code>typ<\/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 lista (separator \u2014 kommatecken) av klassens egenskaper som ska laddas in i datasetet. Masker st\u00f6ds <code>*<\/code> och <code>?<\/code>. Som standard \u2014 <code>*<\/code> (alla egenskaper). Egenskapen <code>%%CLASSNAME<\/code> \u00e4r inst\u00e4lld.<\/li>\n<li><code>namnrymd<\/code> \u2014 omr\u00e5det d\u00e4r fr\u00e5gan kommer att utf\u00f6ras.<\/li>\n<\/ul>\n<p><\/p>\n<p>Alla egenskaper \u00f6verf\u00f6rs som de \u00e4r utom typ-egenskaperna <code>te<\/code>, <code>%Time<\/code>, <code>%Boolean<\/code> och <code>%TimeStamp<\/code> \u2014 de konverteras till motsvarande Python-klasser.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Inpackning \u00f6ver <code>ExecuteClass<\/code>. \u00d6vers\u00e4tter tabellnamnet till klassnamn och anropar <code>ExecuteClass<\/code>. Signatur:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 \u00f6verf\u00f6ring av tabelldata till Python.<\/p>\n<p><\/p>\n<p>Argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>tabell<\/code> \u2014 tabellnamn.<br \/>\nAlla andra argument \u00f6verf\u00f6rs som de \u00e4r till <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Anteckningar<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> och <code>ExecuteTable<\/code> arbetar lika snabbt.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 g\u00e5nger snabbare \u00e4n <code>ExecuteQuery<\/code> p\u00e5 stora datam\u00e4ngder (\u00f6verf\u00f6ringstid mer \u00e4n &gt;0.01 sekunder).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> och <code>ExecuteTable<\/code> fungerar p\u00e5 globaler med denna struktur: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> w <code>key<\/code> \u2014 heltal.<\/li>\n<li>F\u00f6r <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> och <code>ExecuteTable<\/code> st\u00f6dd v\u00e4rdeomr\u00e5de <code>te<\/code> motsvarar intervallet <code>mktime<\/code> och beror p\u00e5 operativsystemet (<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>). Anv\u00e4nd <code>%TimeStamp<\/code>f\u00f6r att \u00f6verf\u00f6ra data utanf\u00f6r detta intervall eller anv\u00e4nd pandas dataframe eftersom detta begr\u00e4nsning endast g\u00e4ller listan.<\/li>\n<li>F\u00f6r <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> och <code>ExecuteTable<\/code> alla argument utom datak\u00e4llan (global, klass eller tabell) och variabeln \u00e4r valfria.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Exempel<\/h2>\n<p><\/p>\n<p>Testklass <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> inneh\u00e5ller en metod som visar alla alternativ f\u00f6r dat\u00f6verf\u00f6ring:<\/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\/\/ Allm\u00e4nna argument\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ Metod 0: ExecuteGlobal utan argument\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ Metod 1: ExecuteGlobal med argument    \n\/\/ N\u00e4r man skickar global anges f\u00e4ltnamn manuellt\n\/\/ globalKey - namn p\u00e5 subskriptet \nset labels = $lb(\"globalKey\", \"Name\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask inneh\u00e5ller ett element mindre \u00e4n labels eftersom \"globalKey\" \u00e4r namn p\u00e5 subskriptet\n\/\/ Vi hoppar \u00f6ver %%CLASSNAME\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ Metod 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ Metod 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ Metod 4: ExecuteQuery\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Anropa metoden <code>do ##class(isc.py.test.Person).Test()<\/code> f\u00f6r att se hur alla metoder f\u00f6r datatransfer fungerar.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Hj\u00e4lpmetoder<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 h\u00e4mta information om variabeln: om den \u00e4r definierad, klass och l\u00e4ngd av serialiseringen.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 \u00e4r variabeln definierad.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 h\u00e4mta klass f\u00f6r variabeln.<\/li>\n<li><code>GetStatus()<\/code> \u2014 h\u00e4mta och ta bort det senaste undantaget p\u00e5 Python-sidan.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 h\u00e4mta modulens variabel och importstatus.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 h\u00e4mta information om funktionen.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilitet<\/h1>\n<p><\/p>\n<p>Du har l\u00e4rt dig att anropa Python Gateway fr\u00e5n terminalen, nu b\u00f6rjar vi anv\u00e4nda den i produktion. Grunden f\u00f6r interaktionen med Python i detta l\u00e4ge \u2014 <code>isc.py.ens.Operation<\/code>. Den g\u00f6r det m\u00f6jligt f\u00f6r oss att:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f6ra Python-kod<\/li>\n<li>Spara\/\u00e5terst\u00e4lla Python-kontext<\/li>\n<li>Ladda och h\u00e4mta data fr\u00e5n Python<\/li>\n<\/ul>\n<p><\/p>\n<p>I princip \u00e4r Python-operation en inslagning av <code>isc.py.Main<\/code>. Operationen <code>isc.py.ens.Operation<\/code> ger m\u00f6jlighet att interagera med Python-processen fr\u00e5n InterSystems IRIS-produkterna. Fem typer av f\u00f6rfr\u00e5gningar st\u00f6ds:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> f\u00f6r att k\u00f6ra Python-kod. Returnerar <code>isc.py.msg.ExecutionResponse<\/code> med resultatet av k\u00f6rningen och v\u00e4rden f\u00f6r beg\u00e4rda variabler.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> f\u00f6r att k\u00f6ra Python-kod. Returnerar <code>isc.py.msg.StreamExecutionResponse<\/code> resultatet av k\u00f6rningen och v\u00e4rden f\u00f6r beg\u00e4rda variabler. Motsvarande <code>isc.py.msg.ExecutionRequest<\/code>, men tar emot och returnerar str\u00f6mmar ist\u00e4llet f\u00f6r str\u00e4ngar.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> f\u00f6r att \u00f6verf\u00f6ra resultatet av SQL-fr\u00e5gan. Returnerar <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> f\u00f6r datatransfer av global\/kategori\/tabell. Returnerar <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> f\u00f6r att spara Python-kontext. Returnerar <code>Ens.StringResponse<\/code> med kontextidentifierare.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> f\u00f6r att \u00e5terst\u00e4lla Python-kontext.<\/p>\n<p><\/p>\n<p>Dessutom, <code>isc.py.ens.Operation<\/code> har tv\u00e5 inst\u00e4llningar:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 val av klass som implementerar gr\u00e4nssnittet <code>isc.py.init.Abstract<\/code>. Den kan anv\u00e4ndas f\u00f6r att ladda funktioner, moduler, klasser etc. Den k\u00f6rs en g\u00e5ng vid processens start.<\/li>\n<li><code>PythonLib<\/code> \u2014 (endast f\u00f6r Linux) om du ser fel vid laddning, st\u00e4ll in dess v\u00e4rde till <code>libpython3.6m.so<\/code> eller till och med till den fullst\u00e4ndiga s\u00f6kv\u00e4gen till Python-biblioteket. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Skapande av aff\u00e4rsprocesser<\/h2>\n<p><\/p>\n<p>Det finns tv\u00e5 klasser som underl\u00e4ttar utvecklingen av aff\u00e4rsprocesser:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> m\u00f6jligg\u00f6r att extrahera annoteringar fr\u00e5n aktiviteter med variabelins\u00e4ttning.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> gj\u00f6r att enkelt testa aff\u00e4rsprocesser med Python. Den kan utf\u00f6ra aff\u00e4rsprocesser (delar p\u00e5 Python-spr\u00e5k) i den aktuella processen.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Variabelers\u00e4ttning<\/h2>\n<p><\/p>\n<p>Alla aff\u00e4rsprocesser som \u00e4rver fr\u00e5n <code>isc.py.ens.ProcessUtils<\/code>, kan anv\u00e4nda metoden <code>GetAnnotation(name)<\/code> f\u00f6r att h\u00e4mta v\u00e4rdet av aktivitetens annotering baserat p\u00e5 dess namn. Aktivitetens annotering kan inneh\u00e5lla variabler som kommer ber\u00e4knas p\u00e5 sidan av InterSystems IRIS innan de skickas till Python. H\u00e4r \u00e4r syntaxen f\u00f6r variabelins\u00e4ttning:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 anrop till metoden<\/li>\n<li><code>#{expr}<\/code> \u2014 exekvera kod i ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ett exempel finns i den testade aff\u00e4rsprocessen <code>isc.py.test.Process<\/code>, t.ex. i aktiviteten <code>Korrelationsmatris: Graf<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. I detta exempel:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> returnerar egenskapen WorkDirectory fr\u00e5n objektet <code>process<\/code>, som \u00e4r en instans av klassen <code>isc.py.test.Process<\/code> dvs. den aktuella aff\u00e4rsprocessen.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> anropar metoden <code>Heltal<\/code> klassen <code>%PopulateUtils<\/code>, genom att skicka argument <code>1<\/code> och <code>100<\/code>, som returnerar ett slumpm\u00e4ssigt heltal inom spannet <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Testaff\u00e4rsprocess<\/h2>\n<p><\/p>\n<p>Testprodukt och testaff\u00e4rsprocess \u00e4r som standard tillg\u00e4ngliga som en del av Python Gateway. F\u00f6r att anv\u00e4nda dem:<\/p>\n<p><\/p>\n<ol>\n<li>K\u00f6r f\u00f6ljande i OS-terminalen: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>K\u00f6r f\u00f6ljande i InterSystems IRIS-terminalen: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> f\u00f6r att fylla i testdata.<\/li>\n<li>K\u00f6r produkten <code>isc.py.test.Production<\/code>.<\/li>\n<li>Skicka en beg\u00e4ran av typen <code>Ens.Request<\/code> p\u00e5 <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>L\u00e5t oss se hur allt fungerar tillsammans. \u00d6ppna <code>isc.py.test.Process<\/code> i BPL-redigeraren:<\/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\">K\u00f6rning av kod<\/h3>\n<p><\/p>\n<p>Det viktigaste anropet \u00e4r att exekvera Python-kod:<\/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>Anv\u00e4nds beg\u00e4ran <code>isc.py.msg.ExecutionRequest<\/code>, h\u00e4r \u00e4r dess egenskaper:<\/p>\n<p><\/p>\n<ul>\n<li><code>Code<\/code> \u2014 Python-kod.<\/li>\n<li><code>SeparateLines<\/code> \u2014 ska koden delas upp i rader f\u00f6r exekvering. <code>$c(10)<\/code> (<code>n<\/code>) anv\u00e4nds f\u00f6r att separera rader. Observera att det INTE rekommenderas att bearbeta meddelandet helt p\u00e5 en g\u00e5ng, denna funktion \u00e4r avsedd endast f\u00f6r behandling <code>def<\/code> och liknande fler-rads uttryck. Som standard <code>0<\/code>.<\/li>\n<li><code>Variabler<\/code> \u2014 en kommaseparerad lista av variabler som kommer att l\u00e4ggas till svaret.<\/li>\n<li><code>Serialisering<\/code> \u2014 Hur man serialiserar variabler som vi vill returnera. Alternativ: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> och <code>Dill<\/code>, som standard <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>I v\u00e5rt fall st\u00e4ller vi bara in egenskapen <code>Code<\/code>, s\u00e5 alla andra egenskaper anv\u00e4nder standardv\u00e4rden. Vi st\u00e4ller in den genom att anropa <code>process.GetAnnotation(\"Import pandas\")<\/code>, vilket under k\u00f6rning returnerar annotationen efter att ha utf\u00f6rt variabelsubstitution. I slut\u00e4ndan kommer koden <code>import pandas as pd<\/code> att \u00f6verf\u00f6ras till Python. <code>GetAnnotation<\/code> kan vara anv\u00e4ndbart f\u00f6r att f\u00e5 fler-rads Python-skript, men det finns inga begr\u00e4nsningar f\u00f6r detta s\u00e4tt att h\u00e4mta kod. Du kan st\u00e4lla in egenskapen <code>Code<\/code> p\u00e5 ett s\u00e4tt som passar dig.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">H\u00e4mtning av variabler<\/h3>\n<p><\/p>\n<p>\u00c4nnu en intressant utmaning med anv\u00e4ndning av <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Korrelationsmatris: 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 ber\u00e4knar Korrelationsmatrisen p\u00e5 Python-sidan och h\u00e4mtar variabeln <code>corrmat<\/code> tillbaka till InterSystems IRIS i JSON-format, genom att st\u00e4lla in fr\u00e5geegenskaperna:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabler<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serialisering<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Vi kan se resultaten 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>Och om vi beh\u00f6ver det h\u00e4r v\u00e4rdet i BP kan det h\u00e4mtas s\u00e5 h\u00e4r: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Datatransmission<\/h3>\n<p><\/p>\n<p>Nu ska vi prata om att \u00f6verf\u00f6ra data fr\u00e5n InterSystems IRIS till Python, alla datatransferfr\u00e5gor implementerar gr\u00e4nssnittet <code>isc.py.msg.DataRequest<\/code>, som tillhandah\u00e5ller f\u00f6ljande egenskaper:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabel<\/code> \u2014 Python-variabeln i vilken data skrivs.<\/li>\n<li><code>Type<\/code> \u2014 datatypes: <code>dataframe<\/code> (pandas dataframe) eller <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 omr\u00e5det fr\u00e5n vilket vi h\u00e4mtar data. Paketet <code>isc.py<\/code> m\u00e5ste vara tillg\u00e4ngligt i detta omr\u00e5de. Det kan vara ett omr\u00e5de utan produktst\u00f6d.<\/li>\n<\/ul>\n<p><\/p>\n<p>Baserat p\u00e5 detta gr\u00e4nssnitt har 4 klasser av fr\u00e5gor implementerats:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 st\u00e4ll in egenskapen <code>Query<\/code> f\u00f6r att \u00f6verf\u00f6ra SQL-fr\u00e5gan.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 st\u00e4ll in egenskapen <code>Klass<\/code> f\u00f6r att \u00f6verf\u00f6ra klassdata.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 st\u00e4ll in egenskapen <code>Tabell<\/code> f\u00f6r att \u00f6verf\u00f6ra tabelldata.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 st\u00e4ll in egenskapen <code>Global<\/code> f\u00f6r att \u00f6verf\u00f6ra globala data.<\/li>\n<\/ul>\n<p><\/p>\n<p>Under testprocessen, titta p\u00e5 aktiviteten <code>RAW<\/code>, d\u00e4r <code>isc.py.msg.QueryRequest<\/code> visad 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\">Spara\/\u00c5terst\u00e4ll Python-kontext<\/h3>\n<p><\/p>\n<p>Slutligen kan vi spara Python-kontexten i InterSystems IRIS, f\u00f6r att g\u00f6ra detta skickar vi <code>isc.py.msg.SaveRequest<\/code> med argument:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2014 Endast variabler som uppfyller masken sparas. St\u00f6der <code>*<\/code> och <code>?<\/code>. Exempel: <code>\"Data*, Figur?\"<\/code>. Som standard <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Maximal l\u00e4ngd f\u00f6r den lagrade variabeln. Om serialiseringen av variabeln \u00e4r l\u00e4ngre, kommer den att ignoreras. St\u00e4ll in 0 f\u00f6r att till\u00e5ta variabler av valfri l\u00e4ngd. Standardinst\u00e4llning: <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Namn<\/code> \u2014 Kontextnamn (valfritt).<\/li>\n<li><code>Beskrivning<\/code> \u2014 Kontextbeskrivning (valfritt).<\/li>\n<\/ul>\n<p><\/p>\n<p>Returnerar <code>Ens.StringResponse<\/code> med <code>Id<\/code> av den sparade kontexten. Under testprocessen, titta p\u00e5 aktiviteten <code>Spara kontext<\/code>.<\/p>\n<p><\/p>\n<p>Relaterad beg\u00e4ran <code>isc.py.msg.RestoreRequest<\/code> laddar kontext fr\u00e5n InterSystems IRIS i Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 kontextidentifierare.<\/li>\n<li><code>Rensa<\/code> \u2014 rensa kontexten innan \u00e5terst\u00e4llning.<\/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 detta \u00e4r en \u00f6ppen k\u00e4llkodswebbapplikation som g\u00f6r det m\u00f6jligt att skapa notebookar som inneh\u00e5ller kod, visualiseringar och text och publicera dem. Python Gateway g\u00f6r det m\u00f6jligt att visa och redigera BPL-processer i form av Jupyter Notebook. Observera att en vanlig Python 3-executor f\u00f6r n\u00e4rvarande anv\u00e4nds.<\/p>\n<p><\/p>\n<p>Detta till\u00e4gg f\u00f6ruts\u00e4tter att kommentarerna inneh\u00e5ller Python-kod och anv\u00e4nder aktiviteters namn som f\u00f6reg\u00e5ende rubriker. Nu \u00e4r det m\u00f6jligt att utveckla PythonGateway aff\u00e4rsprocesser i Jupyter Notebook. H\u00e4r \u00e4r vad som \u00e4r m\u00f6jligt: <\/p>\n<p><\/p>\n<ul>\n<li>Skapa nya aff\u00e4rsprocesser<\/li>\n<li>Ta bort aff\u00e4rsprocesser<\/li>\n<li>Skapa nya aktiviteter<\/li>\n<li>\u00c4ndra aktiviteter<\/li>\n<li>Ta bort aktiviteter<\/li>\n<\/ul>\n<p><\/p>\n<p>H\u00e4r \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">demo-video<\/a><\/noindex>. Och n\u00e5gra sk\u00e4rmdumpar:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Processutforskare<\/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\">Processredigerare<\/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 beh\u00f6ver InterSystems IRIS 2019.2+.<\/li>\n<li>Installera PythonGateway v0.8+ (kr\u00e4vs endast <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> och <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Uppdatera ObjectScript-koden fr\u00e5n lagret.<\/li>\n<li>K\u00f6r <code>do ##class(isc.py.util.Jupyter).Install()<\/code> och f\u00f6lj anvisningarna.<\/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\">Slutsatser<\/h1>\n<p><\/p>\n<p>MLToolkit \u00e4r en upps\u00e4ttning verktyg vars syfte \u00e4r att f\u00f6rena modeller och transaktionella milj\u00f6er s\u00e5 att de byggda modellerna enkelt kan anv\u00e4ndas direkt i dina aff\u00e4rsprocesser. Python Gateway \u00e4r en del av MLToolkit och tillhandah\u00e5ller integration med Python-spr\u00e5ket, vilket m\u00f6jligg\u00f6r orkestrering av vilken maskininl\u00e4rningsalgoritm som helst, skapad p\u00e5 Python (huvudmilj\u00f6n f\u00f6r m\u00e5nga datavetare), med hj\u00e4lp av m\u00e5nga f\u00e4rdiga bibliotek f\u00f6r snabb utveckling av adaptiva, automatiserade analytiska AI\/ML-l\u00f6sningar p\u00e5 InterSystems IRIS-plattformen.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">L\u00e4nkar<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">F\u00f6reg\u00e5ende 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-exempel<\/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 och kurser om Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>MLToolkit-anv\u00e4ndargruppen \u00e4r ett privat GitHub-repo, skapat som en del av f\u00f6retags-GitHub-organisationen InterSystems. Den \u00e4r avsedd f\u00f6r externa anv\u00e4ndare som installerar, utforskar eller redan anv\u00e4nder komponenter fr\u00e5n MLToolkit, inklusive Python Gateway. Gruppen erbjuder en m\u00e4ngd implementerade fallstudier (med k\u00e4llkod och testdata) inom omr\u00e5den som marknadsf\u00f6ring, produktion, medicin och m\u00e5nga andra industrier. F\u00f6r att g\u00e5 med i ML Toolkit-anv\u00e4ndargruppen, v\u00e4nligen skicka ett kort meddelande via e-post till f\u00f6ljande adress: <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> och ange f\u00f6ljande uppgifter i ditt meddelande:<\/p>\n<p><\/p>\n<ul>\n<li>GitHub-anv\u00e4ndarnamn<\/li>\n<li>Organisation (d\u00e4r du arbetar eller studerar)<\/li>\n<li>Position (din aktuella position inom din organisation, eller \"Student\", eller \"Frilansare\").<\/li>\n<li>Land<\/li>\n<\/ul>\n<p><\/p>\n<p>Till dem som har l\u00e4st artikeln och \u00e4r intresserade av m\u00f6jligheterna med InterSystems IRIS som en plattform f\u00f6r utveckling eller hosting av AI- och maskininl\u00e4rningsl\u00f6sningar erbjuder vi att diskutera m\u00f6jliga scenarier av intresse f\u00f6r ert f\u00f6retag. Vi ser fram emot att analysera ert f\u00f6retags behov och tillsammans definiera en handlingsplan; kontaktadressen till v\u00e5r AI\/ML-expertgrupp \u00e4r <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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":"Den h\u00e4r artikeln handlar om Python Gateway \u2014 ett community-projekt med \u00f6ppen k\u00e4llkod f\u00f6r InterSystems IRIS dataplattform.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}