##嵌入式 Python

0 关注者 · 47 帖子

嵌入式 Python 是指将 Python 编程语言集成到 InterSystems IRIS 内核中,允许开发者使用 Python 对数据进行操作并为服务器端应用程序开发业务逻辑。

文档

文章 Michael Lei · 八月 9, 2022 23m read

在这篇文章中,你可以访问InterSystems开发者社区中与学习InterSystems IRIS最相关主题的文章库。找到按机器学习、嵌入式Python、JSON、API和REST应用、管理和配置InterSystems环境、Docker和云、VSCode、SQL、分析/BI、全局、安全、DevOps、互操作性、Native API排列的顶级发表的文章。快来享受学习的乐趣吧!

机器学习

机器学习是建立先进的数据分析和自动化人工活动的一种必要的技术,具有很好的效率。它可以创建认知模型,从现有的数据中学习,并根据其自我调整的算法进行预测、概率计算、分类、识别和 "非创造性 "的人类活动的自动化。

在所有情况下,InterSystems IRIS作为一个数据平台和环境来创建、执行、提供和使用这些机器学习模型。IRIS能够从SQL命令(IntegratedML)中使用ML,使用嵌入式Python和PMML(预测模型标记语言)来执行ML。你可以在以下文章中查看它的功能:

标题

描述

地址URL

一体化机器学习动手实验

一体化机器学习概览ML

https://cn.community.intersystems.com/node/517656

1
0 441
文章 姚 鑫 · 七月 18, 2022 6m read

第九章 使用嵌入式 Python (六)

异常处理

IRIS 异常处理程序可以处理 Python 异常并将它们无缝传递给 ObjectScript。在前面的 库示例的基础上,如果尝试使用不存在的文件调用 ,并在 中捕获异常,会看到以下内容:

USER>try { do canvas.drawImage("C:\Sample\bad.png", 150, 600) } catch { write "Error: ", $zerror, ! }
Error: <THROW> *%Exception.PythonException <THROW> 230 ^^0^DO canvas.drawImage("W:\Sample\isc.png", 150, 600) 
<class 'OSError'>: Cannot open resource "W:\Sample\isc.png" -

这里 : Cannot open resource "W:\Sample\isc.png"是从 传回的异常。

字节和字符串

Python 对“字节”数据类型的对象和字符串(表示字符串的 字节序列)进行了明确区分,它们是简单的 位字节序列。在

0
0 127
文章 姚 鑫 · 七月 17, 2022 4m read

第八章 使用嵌入式 Python (五)

通过引用传递参数

ObjectScript 编写的方法中的参数可以通过值或引用传递。在下面的方法中,签名中第二个和第三个参数前面的 ByRef 关键字表示它们打算通过引用传递。

ClassMethod SandwichSwitch(bread As %String, ByRef filling1 As %String, ByRef filling2 As %String)
{
    set bread = "whole wheat"
    set filling1 = "almond butter"
    set filling2 = "cherry preserves"
}

从 调用方法时,在参数前放置一个句点以通过引用传递它,如下所示:

USER>set arg1 = "white bread"
 
USER>set arg2 = "peanut butter"
 
USER>set arg3 = "grape jelly"
 
USER>do ##class(User.EmbeddedPython).SandwichSwitch(arg1, .arg2, .arg3)
 
USER>write arg1
white bread
USER>write arg2
almond butter
USER>write arg3
cherry preserves
0
0 138
文章 姚 鑫 · 七月 16, 2022 4m read

第七章 使用嵌入式 Python (四)

弥合 ObjectScript 和嵌入式 Python 之间的差距

由于 ObjectScriptPython 语言之间的差异,将需要了解一些有助于弥合语言之间差距的信息。

ObjectScript 方面, 类允许从 ObjectScript 使用 。

在 方面, 模块允许使用 Python 中的 。在 中,键入 以获取其方法和函数的列表。

使用 Python 内置函数

包在 解释器启动时自动加载,它包含语言的所有内置标识符,例如基对象类和所有内置数据类型类、异常类、函数和常量。

可以将此包导入 ObjectScript 以访问所有这些标识符,如下所示:

set builtins = ##class(%SYS.Python).Import("builtins")

函数实际上是内置模块的一个方法,因此现在可以在 中使用此函数:

USER>do builtins.print("hello world!")
hello world!

然后可以使用 命令检查内置对象,因为它是一个 对象,所以它使用内置包的 方法来获取该对象的字符串表示形式。例如:

出于同样的原因,可以使用 方法创建 列表。

0
0 161
文章 姚 鑫 · 七月 15, 2022 5m read

第六章 使用嵌入式 Python (三)

从 ObjectScript 调用嵌入式 Python 代码

使用 Python 库

嵌入式 Python 让可以轻松访问数以千计的有用库。通常称为“包”,它们需要从 Python 包索引 (PyPI) 安装到 /mgr/python 目录中,然后才能使用。

例如, 是一个用于生成 和图形的开源库。以下命令使用软件包安装程序 irispip 在 系统上安装 :

在基于 的系统上,使用:

$ pip3 install --target /InterSystems/IRIS/mgr/python reportlab

安装包后,可以使用 %SYS.Python 类的 方法在 代码中使用它。

给定一个文件位置,以下 方法 创建一个示例 PDF 文件并将其保存到该位置。

Class Demo.PDF
{

ClassMethod CreateSamplePDF(fileloc As %String) As %Status
{
    set canvaslib = ##class(%SYS.Python).Import("reportlab.pdfgen.canvas")
    set canvas = canvaslib.Canvas(fileloc)
    do canvas.drawImage("C:\Sample\isc.png", 150, 600)
    do canvas.drawImage("C:\Sample\python.png", 150, 200)
    do canvas.setFont("Helvetica-Bold", 24)
    do canvas.drawString(25, 450, "InterSystems IRIS & Python. Perfect Together.")
    do canvas.save()
}

}
0
0 251
文章 姚 鑫 · 七月 14, 2022 3m read

第五章 使用嵌入式 Python (二)

在 Python 脚本文件 (.py) 中

还可以使用 irispython 命令执行 Python 脚本。

考虑 Windows 系统上的文件 ,其中包含以下代码:

# print the members of the Fibonacci series that are less than 10
print('Fibonacci series:')
a, b = 0, 1
while a < 10:
    print(a, end=' ')
    a, b = b, a + b

# import the iris module and show the classes in this namespace
import iris
print('\nInterSystems IRIS classes in this namespace:')
status = iris.cls('%SYSTEM.OBJ').ShowClasses()
print(status)

可以从命令行运行 ,如下所示:

C:\InterSystems\IRIS\bin>set IRISUSERNAME = <username>

C:\InterSystems\IRIS\bin>set IRISPASSWORD = <password>

C:\InterSystems\IRIS\bin>set IRISNAMESPACE = USER

C:\InterSystems\IRIS\bin>irispython \python\test.py
Fibonacci series:
0 1 1 2 3 5 8
InterSystems IRIS classes in this namespace:
User.Company
User.Person
1
0
0 165
文章 姚 鑫 · 七月 12, 2022 6m read

第三章 嵌入式Python概述(三)

使用 SQL

IRIS 中的类被投影到 SQL,除了使用类方法或直接全局访问之外,还允许使用查询访问数据。 iris 模块为提供了两种从 运行 语句的不同方式。

以下示例使用 运行 语句以查找类名称以“%Net.LDAP”开头的所有类定义,返回一个包含每个名称和超类的结果集每个班级。在这里,系统类 将 投影为同名表。

>>> rs = iris.sql.exec("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH '%Net.LDAP'")

以下示例使用 准备 查询对象,然后执行查询,将“%Net.LDAP”作为参数传入:

>>> stmt = iris.sql.prepare("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH ?")
>>> rs = stmt.execute("%Net.LDAP")

无论哪种情况,都可以按如下方式遍历结果集,并且输出相同:

>>> for idx, row in enumerate(rs):                                              
...     print(f"[{idx}]: {row}")                                                
...
[0]: ['%Net.LDAP.Client.EditEntry', '%RegisteredObject']
[1]: ['%Net.LDAP.Client.Entries', '%RegisteredObject,%Collection.AbstractIterator']
[2]: ['%Net.LDAP.Client.Entry', '%RegisteredObject,%Collection.AbstractIterator']
[3]: ['%Net.LDAP.Client.PropList', '%RegisteredObject']
[4]: ['%Net.LDAP.Client.Search.Scope', '%Integer']
[5]: ['%Net.LDAP.Client.Session', '%RegisteredObject']
[6]: ['%Net.LDAP.Client.StringList', '%RegisteredObject']
[7]: ['%Net.LDAP.Client.ValueList', '%RegisteredObject,%Collection.AbstractIterator']
1
0 189
文章 Lilian Huang · 七月 13, 2022 5m read

InterSystems Native SDK for Python InterSystems IRIS APIs 的轻量级接口,曾经只能通过 ObjectScript 使用。

准确地说,我对调用 ObjectScript 方法、类方法的能力特别感兴趣。 它可以工作,而且效果很好,但默认情况下,调用只支持标量参数:字符串、布尔值、整数和浮点数。

但如果你想:

- 传递或返回结构,例如字典或列表

- 传递或返回流

您需要编写一些粘合代码或使用这个project (使用 pip install edpy 安装)。 edpy 包会给你一个简单的签名:

call(iris, class_name, method_name, args)

它允许您调用任何 ObjectScript 方法并返回结果。

0
0 495
文章 Frank Ma · 六月 27, 2022 3m read

比较不同的商业智能技术是非常有趣的。我很好奇它们在功能、开发工具、速度和可用性方面有什么不同。

在这个应用程序中,我选择了一个有欧洲各国水状况的数据集。这是一个开源的数据集,包含1991年到2017年的观测数据。

团队和我决定使用IRIS BI、Tableau、PowerBI和InterSystems Reports(由Logi Reports驱动)在这个BI数据集的基础上制作一个模型

对于前端,我们通过Embedded Python在PythonFlask中制作了一个网页界面。

顺便说一下,其结果可以在这个网页上看到:http://atscale.teccod.com:8080/
你可以看看demo stand (演示台),因为从资源库部署一个容器可能需要多至20分钟的时间。大量的python包,后面会有更多的原因。

主页面

数据

事实上,数据似乎很小,期间只有17年 :)

因此,在现有的基础上,我想延续数据集,为此使用了一个神经网络。使用同样的嵌入式Python,使用了Tensorflow,这个包下载后占据了511MB,不要惊讶

实际上,这也是容器部署时间长的原因--为神经网络下载了很多包,相当多的相关包,安装时间很长。不过会有一篇关于神经网络和Integrated ML(一体化机器学习)的单独文章,我很快会发表。

我还要说的是,预测的结果被输入到同一个数据库,所以你可以通过BI工具看到数据集。

0
0 300
文章 Michael Lei · 五月 3, 2022 6m read

Hi 社区,

想象一下,使您的应用程序能够阅读文本?现在有了IRIS的新功能--嵌入式Python,这就成为可能。有了这个新功能,IRIS可以原生地运行任何开源或商业的Python库。gTTS(https://pypi.org/project/gTTS/)是一个免费的库,使用谷歌翻译服务将文本转换成音频。

怎么做

只要通过参数传递文本,gTTS就会返回一个将文本转换为音频的MP3文件。也就是说,你的应用程序可以播放任何文本的音频! 请看如何做到这一点。

1. 进入https://openexchange.intersystems.com/package/IRIS-Text2Audio,点击下载按钮。

2. 克隆/git pull repo到任何本地目录中

$ git clone https://github.com/yurimarx/iris-tts.git

3. 在这个目录中打开一个Docker终端,运行:

$ docker-compose build

4. 运行IRIS container:

$ docker-compose up -d 

5.

0
0 264
文章 Michael Lei · 四月 12, 2022 7m read

程序化访问 Production

要用程序编辑Production(界面),你可以使用互操作性API和SQL查询的组合。

现有的命名空间

从顶层了解你目前正在工作的命名空间和生产是很重要的。

// Object script 
// The active namespace is stored in this variable
$$$NAMESPACE 
// Print namespace
Write $$$NAMESPACE
# Python
import iris
# The active namespace is returned from this method
iris.utils._OriginalNamespace()
# Print namespace
print(iris.utils._OriginalNamespace())
>>> DEMONSTRATION

现有Production (正在或者最后一次运行的Production)

另外,知道你的Production名称是很重要的,你可以使用以下API获得名称空间中正在运行的Production。

// ObjectScript
USER>ZN "DEMONSTRATION"
// Get current or last run production
DEMONSTRATION>W ##class(Ens.Director).GetActiveProductionName()
>>> Hospital.HospitalProduction
0
0 405
文章 Frank Ma · 三月 2, 2022 2m read

如果你的嵌入式Python代码调用了 tkinter library库(它被很多图形制作库使用,包括matplotlib),你可能会得到这个错误:

<THROW> *%Exception.PythonException <CLASS DOES NOT EXIST> 230 ^^0^DO ##CLASS(User.Test).Test() 
<class '_tkinter.TclError'>: Can't find a usable init.tcl in the following directories:

c:/intersystems/irispy/lib/python/lib/tcl8.6
c:/intersystems/irispy/lib/tcl8.6
c:/intersystems/lib/tcl8.6
c:/intersystems/irispy/library
c:/intersystems/library
c:/intersystems/tcl8.6.9/library
c:/tcl8.6.9/library

下面是一个触发这个错误的代码样本:

Class User.Test
{

/// do ##class(User.Test).Test()
ClassMethod Test() [ Language = python ]
{
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s)

ax.set(xlabel='time (s)', ylabel='voltage (mV)')
ax.grid()

fig.savefig("test.png")
}

}
0
0 1284
文章 Frank Ma · 三月 2, 2022 2m read

我们很高兴与你分享有趣的信息,以及告诉你为什么Python是好的,它被用在哪里。

其中使用最多的库是NumPy和Pandas。NumPy(Numerical Python)用来对大型数据集进行分类。它简化了数组上的数学运算及其矢量化。Pandas提供两种数据结构:系列Series(一个元素列表)和数据框架DataFrames(一个有多列的表格)。这个库将数据转换为数据框架,允许你删除和添加新的列,以及执行各种操作。

Python为数据分析项目提供了无数的工具,可以帮助完成任何任务。

0
0 518
文章 Jingwei Wang · 二月 14, 2022 7m read

1. 互操作性-嵌入式Python(interoperability-embedded-python)

这个概念旨在展示iris互操作性框架如何与嵌入的python一起使用。

1.2. 示例代码

import grongier.pex
import iris
import MyResponse

class MyBusinessOperation(grongier.pex.BusinessOperation):

    def OnInit(self):
        print("[Python] ...MyBusinessOperation:OnInit() is called")
        self.LOGINFO("Operation OnInit")
        return

    def OnTeardown(self):
        print("[Python] ...MyBusinessOperation:OnTeardown() is called")
        return

    def OnMessage(self, messageInput):
        if hasattr(messageInput,"_IsA"):
            if messageInput._IsA("Ens.StringRequest"):
                self.LOGINFO(f"[Python] ...This iris class is a Ens.StringRequest with this message {messageInput.StringValue}")
        self.LOGINFO("Operation OnMessage")
        response = MyResponse.MyResponse("...MyBusinessOperation:OnMessage() echos")
        return response
0
0 251