{"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\/it\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway in InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Questo articolo \u00e8 dedicato a Python Gateway, un progetto comunitario open source per la piattaforma di dati InterSystems IRIS. Questo progetto consente di orchestrare qualsiasi algoritmo di machine learning sviluppato in Python (l'ambiente principale per molti Data Scientist), utilizzando numerose librerie pronte all'uso per creare rapidamente soluzioni analitiche AI\/ML adattive e automatizzate sulla piattaforma InterSystems IRIS. In questo articolo mostrer\u00f2 come InterSystems IRIS possa orchestrare processi in Python, facilitare lo scambio bidirezionale di dati e creare processi aziendali intelligenti.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"plan\">Piano<\/h1>\n<p><\/p>\n<ol>\n<li>Introduzione.<\/li>\n<li>Strumenti.<\/li>\n<li>Installazione.<\/li>\n<li>API.<\/li>\n<li>Interoperabilit\u00e0.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Conclusioni.<\/li>\n<li>Riferimenti.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introduzione<\/h1>\n<p><\/p>\n<p>Python \u00e8 un linguaggio di programmazione di alto livello, generico, progettato per migliorare la produttivit\u00e0 dello sviluppatore e la leggibilit\u00e0 del codice. In questa serie di articoli parler\u00f2 delle possibilit\u00e0 di utilizzo del linguaggio Python sulla piattaforma InterSystems IRIS, con un focus principale su come utilizzare Python per la creazione e l'applicazione di modelli di machine learning.<\/p>\n<p><\/p>\n<p>Il machine learning (ML) \u00e8 una classe di metodi di intelligenza artificiale, caratterizzati non dalla soluzione diretta di un problema, ma dall'apprendimento nel processo di risoluzione di molteplici problemi simili. <\/p>\n<p><\/p>\n<p>Gli algoritmi e i modelli di machine learning stanno diventando sempre pi\u00f9 comuni. Ci sono molte ragioni per questo, ma tutto si riporta alla disponibilit\u00e0, semplicit\u00e0 e raggiungimento di risultati pratici. La clusterizzazione o anche la modellazione attraverso reti neurali sono tecnologie nuove? <\/p>\n<p><\/p>\n<p>Naturalmente no, ma al giorno d'oggi non \u00e8 necessario scrivere centinaia di migliaia di righe di codice per avviare un modello, e i costi per la creazione e l'applicazione di modelli continuano a diminuire.<\/p>\n<p><\/p>\n<p>Gli strumenti si stanno evolvendo: mentre non abbiamo strumenti AI\/ML completamente orientati al GUI, il progresso che abbiamo visto con molte altre classi di sistemi informativi, come il BI (dalla scrittura di codice all'uso di framework e soluzioni configurabili orientate al GUI), si osserva anche negli strumenti per la creazione di AI\/ML. Abbiamo gi\u00e0 superato la fase di scrittura di codice e oggi utilizziamo framework per costruire e addestrare modelli.<\/p>\n<p><\/p>\n<p>Altri miglioramenti, come la possibilit\u00e0 di distribuire un modello pre-addestrato, in cui l'utente finale deve semplicemente completare l'addestramento del modello sui propri dati specifici, semplificano anche l'inizio dell'uso del machine learning. Questi risultati rendono molto pi\u00f9 accessibile lo studio del machine learning sia per i professionisti che per le aziende nel loro insieme.<\/p>\n<p><\/p>\n<p>D'altra parte, stiamo raccogliendo sempre pi\u00f9 dati. Grazie a una piattaforma dati unificata, come InterSystems IRIS, tutte queste informazioni possono essere prontamente preparate e utilizzate come dati di partenza per modelli di machine learning.<\/p>\n<p><\/p>\n<p>Con la transizione al cloud, l'avvio di progetti AI\/ML sta diventando pi\u00f9 semplice che mai. Possiamo consumare solo le risorse di cui abbiamo bisogno. Inoltre, grazie alla parallelizzazione offerta dalle piattaforme cloud, possiamo risparmiare tempo.<\/p>\n<p><\/p>\n<p>Ma riguardo ai risultati? Qui le cose si fanno pi\u00f9 complesse. Ci sono molti strumenti per la costruzione di modelli, di cui parler\u00f2 in seguito. Costruire un buon modello non \u00e8 semplice, ma poi? Ottenere un ritorno sull'investimento dall'uso del modello da parte delle aziende \u00e8 anche una sfida non banale. Il cuore del problema risiede nella separazione dei carichi analitici e transazionali e dei modelli di dati. Quando addestriamo un modello, di solito lo facciamo su dati storici. Ma il posto per il modello costruito \u00e8 nell'elaborazione transazionale dei dati. Che valore ha il migliore modello di rilevamento delle frodi se lo eseguiamo una volta al giorno? I truffatori sono gi\u00e0 scappati con i soldi. Dobbiamo addestrare il modello su dati storici, ma dobbiamo anche applicarlo in tempo reale sui nuovi dati in arrivo, affinch\u00e9 i nostri processi aziendali possano funzionare in base alle previsioni effettuate dal modello.<\/p>\n<p><\/p>\n<p>ML Toolkit \u00e8 un insieme di strumenti che ha proprio questo obiettivo: unire modelli e ambiente transazionale, affinch\u00e9 i modelli costruiti possano essere facilmente utilizzati direttamente nei tuoi processi aziendali. Python Gateway fa parte di ML Toolkit e fornisce integrazione con il linguaggio Python (analogamente a come R Gateway, anch'esso parte di ML Toolkit, fornisce integrazione con il linguaggio R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Strumenti<\/h1>\n<p><\/p>\n<p>Prima di continuare, vorrei descrivere alcuni strumenti e librerie per Python che utilizzeremo pi\u00f9 avanti.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Tecnologie<\/h2>\n<p><\/p>\n<ul>\n<li>Python \u00e8 un linguaggio di programmazione interpretato e ad alto livello, di uso generale. Il principale vantaggio del linguaggio \u00e8 la vasta libreria di pacchetti matematici, ML e AI. Proprio come ObjectScript, \u00e8 un linguaggio orientato agli oggetti, ma tutto \u00e8 definito dinamicamente e non staticamente. Inoltre, tutto \u00e8 un oggetto. Articoli successivi presuppongono una familiarit\u00e0 superficiale con il linguaggio. Se desideri iniziare a imparare, ti consiglio di iniziare con <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">documentazione<\/a><\/noindex>.<\/li>\n<li>Per i nostri prossimi esercizi, installa <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: Io uso <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, ma in generale ci sono <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">molte<\/a><\/noindex>. Se utilizzi Atelier, c'\u00e8 un plugin di Eclipse per gli sviluppatori Python. Se usi VS Code, c'\u00e8 un'estensione per Python. <\/li>\n<li>Notebook: invece della IDE, puoi scrivere e condividere i tuoi script in notebook online. Il pi\u00f9 popolare \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Librerie<\/h2>\n<p><\/p>\n<p>Ecco un elenco (non completo) di librerie per l'apprendimento automatico:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u00e8 un pacchetto fondamentale per calcoli di precisione.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u00e8 per strutture dati ad alte prestazioni e strumenti di analisi dei dati.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u00e8 per la creazione di grafici.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u00e8 per la visualizzazione dei dati, basata su matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u00e8 per metodi di apprendimento automatico.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u00e8 per algoritmi di apprendimento automatico nell'ambito della metodologia di boosting graduale (Gradient Boosting).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/radimrehurek.com\/gensim\/\">Gensim<\/a><\/noindex> \u00e8 per NLP.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/keras.io\/\">Keras<\/a><\/noindex> \u00e8 per reti neurali.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u00e8 una piattaforma per la creazione di modelli di machine learning.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u00e8 una piattaforma per la creazione di modelli di machine learning, focalizzata su Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u00e8 per il PMML da vari modelli.<\/li>\n<\/ul>\n<p><\/p>\n<p>Le tecnologie AI\/ML consentono di rendere le aziende pi\u00f9 efficienti e adattabili. Inoltre, oggi queste tecnologie diventano pi\u00f9 semplici da sviluppare e implementare. Inizia a studiare le tecnologie AI\/ML e come possono aiutare la tua organizzazione a crescere.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Installazione<\/h1>\n<p><\/p>\n<p>Ci sono diversi modi per installare e utilizzare il 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>Usa un'immagine da DockerHub<\/li>\n<li>Crea la tua immagine<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Indipendentemente dal metodo di installazione, avrai bisogno del codice sorgente. L'unico posto per scaricare il codice \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">la pagina delle release<\/a><\/noindex>. Essa contiene release stabili testate, prendi semplicemente l'ultima. Attualmente \u00e8 la 0.8, ma nel tempo ne verranno aggiunte di nuove. Non clonare\/scaricare il repository, scarica l'ultima release.<\/p>\n<p><\/p>\n<h2 id=\"os\">OS<\/h2>\n<p><\/p>\n<p>Se stai installando il Python Gateway nel sistema operativo, prima di tutto (indipendentemente dal sistema operativo) devi installare Python. A tal fine:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Installa Python 3.6.7 64 bit<\/a><\/noindex>. \u00c8 consigliabile installare Python nella directory predefinita.<\/li>\n<li>Installa il modulo <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Scarica il codice ObjectScript (cio\u00e8. <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\", , 1)<\/code>) in qualsiasi namespace con prodotti. Nel caso in cui tu voglia che un namespace esistente supporti i prodotti, esegui: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Posiziona <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> nella cartella <code>bin<\/code> del tuo istanza di InterSystems IRIS. Il file della libreria deve essere disponibile nel percorso restituito <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>Assicurati che la variabile d'ambiente <code>PYTHONHOME<\/code> rimandi a Python 3.6.7.<\/li>\n<li>Assicurati che la variabile d'ambiente di sistema <code>PATH<\/code> contenga la variabile <code>PYTHONHOME<\/code> (o la directory a cui punta).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Controlla che la variabile d'ambiente <code>PATH<\/code> contiene <code>\/usr\/lib<\/code> e <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Usa il file <code>\/etc\/environment<\/code> per impostare le variabili d'ambiente.<\/li>\n<li>In caso di errori <code>undefined symbol: _Py_TrueStruct<\/code> imposta la configurazione <code>PythonLib<\/code>. Inoltre, nel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> c'\u00e8 una sezione di risoluzione dei problemi.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Attualmente \u00e8 supportato solo Python 3.6.7 di <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org.<\/a><\/noindex>Controlla la variabile <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Se hai modificato le variabili d'ambiente, riavvia il tuo prodotto InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>L'uso dei container ha diversi vantaggi: <\/p>\n<p><\/p>\n<ul>\n<li>Portabilit\u00e0<\/li>\n<li>Efficienza<\/li>\n<li>Isolamento<\/li>\n<li>Leggerezza<\/li>\n<li>Immutabilit\u00e0<\/li>\n<\/ul>\n<p><\/p>\n<p>Consulta questa <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">serie di articoli<\/a><\/noindex> per ulteriori informazioni su come utilizzare Docker con i prodotti InterSystems. <\/p>\n<p><\/p>\n<p>Tutte le build del Python Gateway sono attualmente basate su container. <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Immagine pronta<\/h3>\n<p><\/p>\n<p>Esegui: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, per scaricare e avviare il Python Gateway con InterSystems IRIS Community Edition. \u00c8 tutto.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Crea la tua immagine<\/h3>\n<p><\/p>\n<p>Per costruire l'immagine Docker esegui nella radice del repository: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nPer impostazione predefinita, l'immagine viene costruita sulla base dell'immagine <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, tuttavia puoi modificarlo impostando la variabile <code>IMAGE.<\/code>.<br \/>\nPer comporre da InterSystems IRIS, eseguire: `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>Dopo di che puoi avviare l'immagine Docker:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">docker run -d \n  -p 52773:52773 \n  -v \/\/:\/mount \n  --name irispy \n  intersystemscommunity\/irispy:latest \n  --key \/mount\/iris.key<\/code><\/pre>\n<p><\/p>\n<p>Se stai utilizzando un'immagine basata su InterSystems IRIS Community Edition, non \u00e8 necessario specificare la chiave.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Commenti<\/h3>\n<p><\/p>\n<ul>\n<li>Processo di test <code>isc.py.test.Process<\/code> salva una serie di immagini in una directory temporanea. Potresti voler cambiare questo percorso in una directory montata. Per farlo, modifica l'impostazione <code>WorkingDir<\/code> indicando la directory montata.<\/li>\n<li>Per accedere al terminale esegui: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Accesso al Portale di Gestione di Sistema tramite login <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Per fermare il contenitore esegui: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Verifica dell'installazione<\/h2>\n<p><\/p>\n<p>Dopo aver installato Python Gateway, \u00e8 consigliabile verificare che funzioni. Esegui questo codice nel terminale 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>Il risultato dovrebbe essere <code>HELLO<\/code> \u2014 valore della variabile Python <code>x<\/code>. Se lo stato restituito <code>sc<\/code> \u00e8 un errore o <code>var<\/code> vuoto, controlla <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 sezione di risoluzione dei problemi<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway \u00e8 installato e hai verificato che funzioni. \u00c8 ora di iniziare a usarlo!<br \/>\nL'interfaccia principale per Python \u00e8 <code>isc.py.Main<\/code>. Propone i seguenti gruppi di metodi (tutti restituiscono <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Esecuzione del codice<\/li>\n<li>Trasmissione dei dati<\/li>\n<li>Metodi ausiliari<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Esecuzione del codice<\/h2>\n<p><\/p>\n<p>Questi metodi consentono di eseguire codice Python arbitrario.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u00e8 il metodo principale. Accetta 4 argomenti opzionali:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 stringa di codice da eseguire. Carattere di nuova linea: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 nome della variabile da restituire.<\/li>\n<li><code>serialization<\/code> \u2014 come serializzare <code>returnVariable<\/code>. 0 \u2014 string (predefinito), 1 \u2014 repr.<\/li>\n<li><code>risultato<\/code> \u2014 riferimento ByRef a una variabile in cui viene salvato il valore <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sopra abbiamo eseguito:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).SimpleString(\"x='HELLO'\", \"x\", , .var).<\/code><\/pre>\n<p><\/p>\n<p>In questo esempio assegniamo a una variabile Python <code>x<\/code> valore <code>Ciao<\/code> e vogliamo restituire il valore della variabile Python <code>x<\/code> in una variabile ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode \u00e8 un'alternativa pi\u00f9 sicura e meno limitata <code>SimpleString<\/code>.<br \/>\nLe stringhe nella piattaforma InterSystems IRIS sono limitate a 3.641.144 caratteri, e se desideri eseguire un pezzo di codice pi\u00f9 lungo, devi usare i flussi.<br \/>\nAccetta due argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 stringa o flusso di codice Python da eseguire.<\/li>\n<li><code>variable<\/code> \u2014 (opzionale) assegna il risultato dell'esecuzione <code>code<\/code> a questa variabile Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Esempio di utilizzo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).ExecuteCode(\"2*3\", \"y\").<\/code><\/pre>\n<p><\/p>\n<p>In questo esempio moltiplichiamo 2 per 3 e salviamo il risultato in una variabile Python <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Trasmissione dei dati<\/h2>\n<p><\/p>\n<p>Passa dati a Python e ritorno.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Ci sono 4 modi per ottenere il valore di una variabile Python in InterSystems IRIS, a seconda della serializzazione di cui hai bisogno:<\/p>\n<p><\/p>\n<ul>\n<li><code>String<\/code> per tipi di dati semplici e per il debug.<\/li>\n<li><code>Repr<\/code> per la memorizzazione di oggetti semplici e il debugging.<\/li>\n<li><code>JSON<\/code> per la facile manipolazione dei dati su InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> per la persistenza degli oggetti.<\/li>\n<\/ul>\n<p><\/p>\n<p>Questi metodi consentono di ottenere variabili da Python come stringhe o flussi.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 ottenere <code>serialization<\/code> variabile <code>variable<\/code> in <code>stream<\/code>Se <code>useString<\/code> \u00e8 uguale a 1 e la serializzazione \u00e8 posizionata in una stringa, allora restituisce una stringa e non un flusso.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 ottenere la serializzazione JSON della variabile.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 ottenere la serializzazione Pickle (o Dill) della variabile.<\/li>\n<\/ul>\n<p><\/p>\n<p>Proviamo a ottenere la nostra variabile <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>Carichiamo i dati da InterSystems IRIS in Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 crea un set di dati (pandas <code>dataframe<\/code> o <code>list<\/code>) da una query SQL e lo imposta in una variabile Python. <code>variable<\/code>. Il pacchetto <code>isc.py<\/code> deve essere accessibile nel namespace <code>namespace<\/code> \u2014 qui verr\u00e0 eseguita la query.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 carica i dati da un globale <code>global<\/code> dalla sottoscrizione <code>start<\/code> fino a <code>end<\/code> in Python come una variabile di tipo <code>type<\/code>: <code>list<\/code>, oppure pandas. <code>dataframe<\/code>La descrizione degli argomenti opzionali <code>maschera<\/code> and <code>labels<\/code> \u00e8 disponibile nella documentazione della classe e nel repository <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentazione sul trasferimento dati<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 carica i dati da una classe <code>class<\/code> dall'id <code>start<\/code> fino a <code>end<\/code> in Python come una variabile di tipo <code>type<\/code>: <code>list<\/code>, oppure pandas. <code>dataframe<\/code>. <code>properties<\/code> \u2014 un elenco (separato da virgola) di propriet\u00e0 della classe da caricare nel set di dati. Sono supportate le maschere. <code>*<\/code> e <code>?<\/code>Per impostazione predefinita \u2014 <code>*<\/code> (tutte le propriet\u00e0). La propriet\u00e0 <code>%%CLASSNAME<\/code> viene ignorato.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 carica i dati da una tabella <code>table<\/code> dall'id <code>start<\/code> fino a <code>end<\/code> in Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 \u00e8 universale (qualsiasi SQL valido verr\u00e0 passato a Python). Tuttavia, <code>ExecuteGlobal<\/code> e le sue wrapper <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> hanno alcune limitazioni. Sono molto pi\u00f9 veloci (3-5 volte pi\u00f9 veloci del driver ODBC e 20 volte pi\u00f9 veloci <code>ExecuteQuery<\/code>). Ulteriori informazioni sono disponibili in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentazione sul trasferimento dati<\/a><\/noindex>.<br \/>\nTutti questi metodi supportano il trasferimento di dati da qualsiasi namespace. Il pacchetto <code>isc.py<\/code> deve essere accessibile nel namespace di destinazione.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 trasferimento dei risultati di qualsiasi SQL valido a Python. Questo \u00e8 il metodo pi\u00f9 lento per il trasferimento dei dati. Usalo se <code>ExecuteGlobal<\/code> e le sue wrapper non sono disponibili.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 query SQL.<\/li>\n<li><code>variable<\/code> \u2014 nome della variabile Python in cui vengono scritti i dati.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 namespace in cui verr\u00e0 eseguita la query.<\/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, labelels, namespace)<\/code> \u2014 trasferimento di un globale in Python.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 nome del globale senza <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 nome della variabile Python in cui vengono scritti i dati.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 primo sottoscrittore del globale. Obbligatorio <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 ultimo sottoscrittore del globale. Obbligatorio <code>%Integer<\/code>.<\/li>\n<li><code>maschera<\/code> \u2014 maschera dei valori globali. La maschera pu\u00f2 essere pi\u00f9 corta del numero di campi nella variabile globale (in tal caso, i campi finali verranno omessi). Come formattare la maschera:\n<ul>\n<li><code>+<\/code> passare il valore cos\u00ec com'\u00e8.<\/li>\n<li><code>-<\/code> saltare il valore.<\/li>\n<li><code>b<\/code> \u2014 Tipo logico (<code>0<\/code> \u2014 <code>False<\/code>, tutto il resto \u00e8 <code>Vero<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Data (da $horolog, su Windows dal 1970, su Linux dal 1900).<\/li>\n<li><code>t<\/code> \u2014 Ora ($horolog, secondi dopo mezzanotte).<\/li>\n<li><code>m<\/code> \u2014 Timestamp (stringa nel formato ANNO-MESE-GIORNO ORA:MINUTI:SECONDI).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Elenco dei nomi delle colonne. Il primo elemento \u00e8 il nome del sottomodulo.<\/li>\n<li><code>namespace<\/code> \u2014 namespace in cui verr\u00e0 eseguita la query.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Involucro sopra <code>ExecuteGlobal<\/code>. Basandosi sulla definizione della classe, prepara la chiamata <code>ExecuteGlobal<\/code> e la esegue.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 passaggio dei dati della classe in Python.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>class<\/code> \u2014 nome della classe<\/li>\n<li><code>variable<\/code> \u2014 nome della variabile Python in cui vengono scritti i dati.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 Id iniziale.<\/li>\n<li><code>end<\/code> \u2014 Id finale<\/li>\n<li><code>properties<\/code> \u2014 un elenco (separato da virgola) di propriet\u00e0 della classe da caricare nel set di dati. Sono supportate le maschere. <code>*<\/code> e <code>?<\/code>Per impostazione predefinita \u2014 <code>*<\/code> (tutte le propriet\u00e0). La propriet\u00e0 <code>%%CLASSNAME<\/code> viene ignorato.<\/li>\n<li><code>namespace<\/code> \u2014 namespace in cui verr\u00e0 eseguita la query.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tutte le propriet\u00e0 vengono passate cos\u00ec come sono, tranne le propriet\u00e0 dei tipi <code>te<\/code>, <code>%Ora<\/code>, <code>%Booleano<\/code> e <code>%Timestamp<\/code> \u2014 vengono convertiti nelle corrispondenti classi Python.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Involucro sopra <code>ExecuteClass<\/code>. Trasmette il nome della tabella al nome della classe e chiama <code>ExecuteClass<\/code>. Firma:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 passaggio dei dati della tabella in Python.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 nome della tabella.<br \/>\nTutti gli altri argomenti vengono passati cos\u00ec come sono a <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Note<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> lavorano tutte con la stessa velocit\u00e0.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 volte pi\u00f9 veloci rispetto a <code>ExecuteQuery<\/code> su grandi set di dati (tempo di trasferimento maggiore di &gt;0.01 secondi).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> lavorano su variabili globali con questa struttura: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> dove <code>key<\/code> \u2014 numero intero.<\/li>\n<li>Per <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> intervallo di valori supportato <code>te<\/code> corrisponde all'intervallo <code>mktime<\/code> e dipende dal sistema operativo (<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>). Utilizzare <code>%Timestamp<\/code>per passare dati al di fuori di questo intervallo o utilizzare un dataframe di pandas poich\u00e9 questa \u00e8 una limitazione solo per l'elenco.<\/li>\n<li>Per <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> tutti gli argomenti tranne la sorgente dei dati (variabile globale, classe o tabella) e la variabile sono opzionali.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Esempi<\/h2>\n<p><\/p>\n<p>Classe di test <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> contiene un metodo che dimostra tutte le varianti di passaggio dei dati:<\/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\/\/ Argomenti comuni\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ Metodo 0: ExecuteGlobal senza argomenti\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ Metodo 1: ExecuteGlobal con argomenti\n\/\/ Quando si passa il globale, i nomi dei campi sono impostati manualmente\n\/\/ globalKey - nome del sottoscrittore\nset labels = $lb(\"globalKey\", \"Nome\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask contiene un elemento in meno rispetto a labels perch\u00e9 \"globalKey\" \u00e8 il nome del sottoscrittore\n\/\/ Saltiamo %%CLASSNAME\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ Metodo 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ Metodo 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ Metodo 4: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Chiama il metodo <code>do ##class(isc.py.test.Person).Test()<\/code> per vedere come funzionano tutti i metodi di trasferimento dati.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Metodi di supporto<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 ottenere informazioni sulla variabile: se \u00e8 definita, classe e lunghezza della serializzazione.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 se la variabile \u00e8 definita.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 ottenere la classe della variabile.<\/li>\n<li><code>GetStatus()<\/code> \u2014 ottenere e rimuovere l'ultima eccezione dal lato Python.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 ottenere la variabile del modulo e lo stato dell'importazione.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 ottenere informazioni sulla funzione.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilit\u00e0<\/h1>\n<p><\/p>\n<p>Hai imparato a chiamare il Python Gateway dal terminale, ora iniziamo a usarlo in produzione. La base dell'interazione con Python in questo modo \u00e8 <code>isc.py.ens.Operation<\/code>. Ci permette di:<\/p>\n<p><\/p>\n<ul>\n<li>Eseguire codice Python<\/li>\n<li>Salvare\/Ripristinare il contesto Python<\/li>\n<li>Caricare e ottenere dati da Python<\/li>\n<\/ul>\n<p><\/p>\n<p>In pratica, l'operazione Python \u00e8 un wrapper su <code>isc.py.Main<\/code>. L'operazione <code>isc.py.ens.Operation<\/code> consente di interagire con il processo Python dalle produzioni InterSystems IRIS. Sono supportate cinque richieste:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> per eseguire codice Python. Restituisce <code>isc.py.msg.ExecutionResponse<\/code> con il risultato dell'esecuzione e i valori delle variabili richieste.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> per eseguire codice Python. Restituisce <code>isc.py.msg.StreamExecutionResponse<\/code> risultato dell'esecuzione e valori delle variabili richieste. Simile <code>isc.py.msg.ExecutionRequest<\/code>, ma accetta e restituisce flussi invece di stringhe.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> per trasferire il risultato dell'esecuzione della query SQL. Restituisce <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> per la trasmissione dei dati globale\/classe\/tabella. Restituisce <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> per salvare il contesto Python. Restituisce <code>Ens.StringResponse<\/code> con l'identificativo del contesto.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> per ripristinare il contesto Python.<\/p>\n<p><\/p>\n<p>Inoltre, <code>isc.py.ens.Operation<\/code> ha due impostazioni:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 selezione della classe che implementa l'interfaccia <code>isc.py.init.Abstract<\/code>. Pu\u00f2 essere utilizzato per caricare funzioni, moduli, classi ecc. Viene eseguito una sola volta all'avvio del processo.<\/li>\n<li><code>PythonLib<\/code> \u2014 (solo per Linux) se vedi errori durante il caricamento, impostane il valore su <code>libpython3.6m.so<\/code> o anche sul percorso completo della libreria Python. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Creazione di processi aziendali<\/h2>\n<p><\/p>\n<p>Sono disponibili due classi che semplificano lo sviluppo di processi aziendali:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> per estrarre annotazioni dalle attivit\u00e0 con sostituzione di variabili.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> per testare facilmente i processi aziendali con Python. Pu\u00f2 eseguire il processo aziendale (parti in linguaggio Python) nel processo attuale.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Sostituzione delle variabili<\/h2>\n<p><\/p>\n<p>Tutti i processi aziendali ereditati da <code>isc.py.ens.ProcessUtils<\/code>, possono utilizzare il metodo <code>GetAnnotation(name)<\/code> per ottenere il valore dell'annotazione dell'attivit\u00e0 per il suo nome. L'annotazione dell'attivit\u00e0 pu\u00f2 contenere variabili che verranno calcolate dal lato di InterSystems IRIS prima di essere passate a Python. Ecco la sintassi per la sostituzione delle variabili:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 chiamata del metodo<\/li>\n<li><code>#{expr}<\/code> \u2014 eseguire codice in linguaggio ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Un esempio \u00e8 disponibile nel processo aziendale di test <code>isc.py.test.Process<\/code>, ad esempio, nell'attivit\u00e0 <code>Correlation Matrix: Graph<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. In questo esempio:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> restituisce la propriet\u00e0 WorkDirectory dell'oggetto <code>process<\/code>, che \u00e8 un'istanza della classe <code>isc.py.test.Process<\/code> cio\u00e8 il processo aziendale attuale.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> chiama il metodo <code>Intero<\/code> classe <code>%PopulateUtils<\/code>, passando argomenti <code>1<\/code> e <code>100<\/code>, restituendo un numero intero casuale nell'intervallo <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Processo aziendale di test<\/h2>\n<p><\/p>\n<p>Il prodotto di test e il processo aziendale di test sono disponibili per impostazione predefinita come parte del gateway Python. Per utilizzarli:<\/p>\n<p><\/p>\n<ol>\n<li>Esegui nel terminale OS: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>Esegui nel terminale InterSystems IRIS: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> per riempire i dati di test.<\/li>\n<li>Avvia il prodotto <code>isc.py.test.Production<\/code>.<\/li>\n<li>Invia una richiesta di tipo <code>Ens.Request<\/code> in <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Vediamo come funziona tutto insieme. Apri <code>isc.py.test.Process<\/code> nell'editor BPL:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/6f83b22e0167e2699d285f3e32bfe373.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"ispolnenie-koda-1\">Esecuzione del codice<\/h3>\n<p><\/p>\n<p>La chiamata pi\u00f9 importante \u00e8 l'esecuzione del codice Python:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Viene utilizzata la richiesta <code>isc.py.msg.ExecutionRequest<\/code>, ecco le sue propriet\u00e0:<\/p>\n<p><\/p>\n<ul>\n<li><code>Codice<\/code> \u2014 codice Python.<\/li>\n<li><code>SeparateLines<\/code> \u2014 separare il codice in righe per l'esecuzione. <code>$c(10)<\/code> (<code>n<\/code>) viene utilizzato per separare le righe. Si prega di notare che NON \u00e8 consigliabile elaborare il messaggio tutto in una volta, questa funzione \u00e8 destinata solo all'elaborazione <code>def<\/code> e simili espressioni multilinea. Per impostazione predefinita <code>0<\/code>.<\/li>\n<li><code>Variabili<\/code> \u00e8 un elenco di variabili separate da virgole, che verranno aggiunte alla risposta.<\/li>\n<li><code>Serializzazione<\/code> \u2014 Come serializzare le variabili che vogliamo restituire. Opzioni: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> e <code>Dill<\/code>, per impostazione predefinita <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nel nostro caso, stiamo solo impostando la propriet\u00e0 <code>Codice<\/code>, quindi tutte le altre propriet\u00e0 utilizzano i valori predefiniti. La impostiamo chiamando <code>process.GetAnnotation(\"Import pandas\")<\/code>, che durante l'esecuzione restituisce l'annotazione dopo aver eseguito la sostituzione delle variabili. Alla fine, il codice <code>import pandas as pd<\/code> verr\u00e0 passato a Python. <code>GetAnnotation<\/code> pu\u00f2 essere utile per ottenere script Python multilinea, ma non ci sono limitazioni su questo metodo di ottenimento del codice. Puoi impostare la propriet\u00e0 <code>Codice<\/code> in qualsiasi modo tu preferisca.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Ottenere variabili<\/h3>\n<p><\/p>\n<p>Un'altra interessante chiamata utilizzando <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Matrice di Correlazione: Tabellare<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Calcola la Matrice di Correlazione lato Python ed estrae la variabile <code>corrmat<\/code> indietro in InterSystems IRIS in formato JSON, impostando le propriet\u00e0 della richiesta:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabili<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serializzazione<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Possiamo vedere i risultati in Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se avessimo bisogno di questo valore in BP, possiamo ottenerlo in questo modo: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Trasmissione dei dati<\/h3>\n<p><\/p>\n<p>Parliamo quindi del trasferimento di dati da InterSystems IRIS a Python, tutte le richieste di trasferimento dati implementano l'interfaccia <code>isc.py.msg.DataRequest<\/code>, che fornisce le seguenti propriet\u00e0:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabile<\/code> \u2014 variabile Python in cui vengono scritti i dati.<\/li>\n<li><code>Type<\/code> \u2014 tipo di variabile: <code>dataframe<\/code> (dataframe pandas) o <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 campo da cui otteniamo i dati. Il pacchetto <code>isc.py<\/code> deve essere accessibile in questo campo. Pu\u00f2 trattarsi di un'area senza supporto per i prodotti.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sulla base di questa interfaccia sono stati implementati 4 classi di richiesta:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Query<\/code> per passare una richiesta SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Classe<\/code> per passare i dati della classe.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Tabella<\/code> per passare i dati della tabella.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Globale<\/code> per passare i dati globali.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nel processo di test, guarda l'attivit\u00e0 <code>RAW<\/code>, dove <code>isc.py.msg.QueryRequest<\/code> mostrato in azione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/f6a2a520594341b9d37110bcd24b1015.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"sohranenievosstanovlenie-python-konteksta\">Salvataggio\/ripristino del contesto Python<\/h3>\n<p><\/p>\n<p>Infine, possiamo salvare il contesto Python in InterSystems IRIS, per farlo, inviamo <code>isc.py.msg.SaveRequest<\/code> con i seguenti argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>Maschera<\/code> \u2014 Vengono salvate solo le variabili che soddisfano la maschera. Sono supportati <code>*<\/code> e <code>?<\/code>. Esempio: <code>\"Data*, Figura?\"<\/code>. Per impostazione predefinita <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Lunghezza massima della variabile memorizzata. Se la serializzazione della variabile supera tale lunghezza, verr\u00e0 ignorata. Imposta 0 per consentire variabili di qualsiasi lunghezza. Di default <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Name<\/code> \u2014 Nome del contesto (opzionale).<\/li>\n<li><code>Descrizione<\/code> \u2014 Descrizione del contesto (opzionale).<\/li>\n<\/ul>\n<p><\/p>\n<p>Restituisce <code>Ens.StringResponse<\/code> con <code>Id<\/code> del contesto salvato. Durante il processo di test, osserva l'attivit\u00e0 <code>Salva Contesto<\/code>.<\/p>\n<p><\/p>\n<p>La richiesta corrispondente <code>isc.py.msg.RestoreRequest<\/code> carica il contesto da InterSystems IRIS in Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identificatore del contesto.<\/li>\n<li><code>Cancella<\/code> \u2014 svuotare il contesto prima del ripristino.<\/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 questa \u00e8 un'applicazione web open source che consente di creare notebook contenenti codice, visualizzazioni e testo e di pubblicarli. Python Gateway consente di visualizzare e modificare i processi BPL in forma di Jupyter Notebook. Nota che attualmente viene utilizzato l'esecutore Python 3 standard.<\/p>\n<p><\/p>\n<p>Questa estensione presuppone che le annotazioni contengano codice Python e utilizzano i nomi delle attivit\u00e0 come intestazioni precedenti. Ora \u00e8 possibile sviluppare processi aziendali PythonGateway in Jupyter Notebook. Ecco cosa \u00e8 possibile: <\/p>\n<p><\/p>\n<ul>\n<li>Creare nuovi processi aziendali<\/li>\n<li>Eliminare processi aziendali<\/li>\n<li>Creare nuove attivit\u00e0<\/li>\n<li>Modificare attivit\u00e0<\/li>\n<li>Eliminare attivit\u00e0<\/li>\n<\/ul>\n<p><\/p>\n<p>Ecco <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">video dimostrativo<\/a><\/noindex>. E alcune schermate:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Esploratore di processi<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/6da1aa0a026c34238c57f96e82742bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"redaktor-processa\">Editor di processi<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/651031fe9792cc1c5926aa386f4e37fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"ustanovka-1\">Installazione<\/h2>\n<p><\/p>\n<ol>\n<li>Hai bisogno di InterSystems IRIS 2019.2+.<\/li>\n<li>Installa PythonGateway v0.8+ (solo necessario <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> e <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Aggiorna il codice ObjectScript dal repository.<\/li>\n<li>Esegui <code>do ##class(isc.py.util.Jupyter).Install()<\/code> e segui le istruzioni.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Documentazione<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Conclusioni<\/h1>\n<p><\/p>\n<p>MLToolkit \u00e8 un insieme di strumenti il cui obiettivo \u00e8 quello di unire i modelli e l'ambiente transazionale, affinch\u00e9 i modelli costruiti possano essere facilmente utilizzati direttamente nei tuoi processi aziendali. Python Gateway \u00e8 parte di MLToolkit e fornisce integrazione con il linguaggio Python, consentendo di orchestrare qualsiasi algoritmo di machine learning creato in Python (l'ambiente principale per molti Data Scientist), utilizzando numerose librerie pronte per una rapida creazione di soluzioni analitiche AI\/ML adattive e robotizzate sulla piattaforma InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Link<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">Articolo precedente<\/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\">Esempi di Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/Convergent-Analytics\">Convergent-Analytics<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bit<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">Documentazione e corsi su Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>Il gruppo utenti MLToolkit \u00e8 un repository GitHub privato, creato come parte dell'organizzazione aziendale GitHub di InterSystems. \u00c8 rivolto a utenti esterni che installano, esplorano o gi\u00e0 utilizzano i componenti di MLToolkit, incluso Python Gateway. Il gruppo offre una serie di casi pratici implementati (con codice sorgente e dati di test) in ambito marketing, produzione, medicina e molte altre aree. Per unirti al gruppo utenti ML Toolkit, ti preghiamo di inviare un breve messaggio via e-mail al seguente indirizzo: <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com?subject=MLToolkit%20user%20group&amp;body=Hello.%0A%0APlease%20add%20me%20to%20ML%20Toolkit%20user%20group%3A%0A%0A-%20GitHub%20username%3A%20%0A%0A-%20Name%3A%20%0A%0A-%20Company%3A%20%0A%0A-%20Position%3A%0A-%20Country%3A%20%0A%0A\">MLToolkit@intersystems.com<\/a><\/noindex> e specifica nella tua e-mail i seguenti dati:<\/p>\n<p><\/p>\n<ul>\n<li>Nome utente GitHub<\/li>\n<li>Organizzazione (dove lavori o studi)<\/li>\n<li>Posizione (la tua posizione effettiva nella tua organizzazione, oppure \"Studente\", oppure \"Indipendente\").<\/li>\n<li>Paese<\/li>\n<\/ul>\n<p><\/p>\n<p>A coloro che hanno letto l'articolo e sono interessati alle potenzialit\u00e0 di InterSystems IRIS come piattaforma per lo sviluppo o l'hosting di meccanismi di intelligenza artificiale e machine learning, proponiamo di discutere scenari interessanti per la tua azienda. Siamo pronti ad analizzare le esigenze della tua azienda e a definire insieme un piano d'azione; l'indirizzo e-mail del nostro gruppo di esperti AI\/ML \u00e8 <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/486984\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":41222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-41221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-06T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-06T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Python Gateway in InterSystems IRIS | ProHoster","description":"Questo articolo \u00e8 dedicato a Python Gateway \u2014 un progetto comunitario open source per la piattaforma dati InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}