Published on InterSystems Developer Community (https://community.intersystems.com)

主页 > InterSystems IRIS 嵌入式 Python 模板

文章
Michael Lei · 十二月 13, 2022 阅读大约需 7 分钟
Open Exchange

InterSystems IRIS 嵌入式 Python 模板

嵌入式 Python 模板

今天你们分享一个简单的嵌入式 Python 模板,我建议将其作为任何使用 InterSystems IRIS 并将使用嵌入式 Python 的通用项目的起点。

功能:

  • 随时可用的嵌入式 Python;
  • 3 种嵌入式 Python 开发方式示例;
  • 随时可用的 VSCode 开发;
  • 支持 Docker;
  • 支持在线演示;
  • 随时可用的 ZPM 优先开发。

下面讨论一下这些功能!

我们先来谈谈嵌入式 Python。 此功能在 InterSystems IRIS 2021.2 中提供,它允许使用 InterSystems IRIS 通过 Python 开发解决方案。 IRIS 2021.2 及以上版本允许使用 InterSystems IRIS 在共享内存环境中执行 Python 脚本,这为 Python 开发者在使用代码与数据相近的数据库时提供了独特的选项。

3 种使用嵌入式 Python 进行开发的模式

从 ObjectScript 调用 Python 库

此操作因 %SYS.Python 类而变为可能,该类允许导入 Python 库并通过 ObjectScirpt 调用 Python。 文档、示例。 请查看以下代码:

<span class="hljs-keyword">ClassMethod</span> Today() <span class="hljs-keyword">As</span> <span class="hljs-built_in">%Status</span>
{
  <span class="hljs-keyword">Set</span> sc = <span class="hljs-built_in">$$$OK</span>
  <span class="hljs-keyword">Set</span> dt = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"datetime"</span>)
  <span class="hljs-keyword">write</span> dt.date.today().isoformat()
  <span class="hljs-keyword">Return</span> sc
}

使用 Python 编写 ObjectScript 类方法

事实上,现在开发者可以使用纯 Python 在方法签名和代码中添加 [Language=python] 标签。 还有一个辅助 Python 库“iris”,可以用于引用 ObjectScript 类和全局变量。 文档、示例、示例代码:

ClassMethod CreateRecordPython(propValue As %VarString, ByRef id As %Integer) [ Language = python ]
{
    <span class="hljs-keyword">import</span> iris
    obj=iris.cls(__name__)._New()
    obj.Test=propValue
    sc=obj._Save()
    id=obj._Id()
    <span class="hljs-keyword">return</span> sc
}

使用纯 Python 编写 InterSystems IRIS 解决方案代码

这是开发者可以选择的第三种处理 IRIS 的方式。 这里,Python 脚本需要连接到 IRIS,此操作可以通过环境变量和设为“On”的 CallIn 服务来完成,请参见下面的详细信息。 设置完后,使用 IRIS 在共享内存中执行 Python 脚本。 在这里,“iris”库也非常有用。 文档、示例。

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create_rec</span><span class="hljs-params">(var)</span>:</span>
    obj=iris.cls(<span class="hljs-string">'dc.python.PersistentClass'</span>)._New()
    obj.Test=var
    obj._Save()
    id=obj._Id()
    <span class="hljs-keyword">return</span> id

<span class="hljs-comment"># test record creation</span>
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
now=str(datetime.now())
print(<span class="hljs-string">"Creating new record in dc.python.PersistentClass"</span>)
print(create_rec(now))

<span class="hljs-comment">## run SQL and print data</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run_sql</span><span class="hljs-params">(query)</span>:</span>
    rs=iris.sql.exec(query)
    <span class="hljs-keyword">for</span> idx, row <span class="hljs-keyword">in</span> enumerate(rs):
        print(<span class="hljs-string">f"[<span class="hljs-subst">{idx}</span>]: <span class="hljs-subst">{row}</span>"</span>)

query=<span class="hljs-string">"Select * from dc_python.PersistentClass"</span>
print(<span class="hljs-string">"Running SQL query "</span>+query)
run_sql(query)

支持 Docker

模板仓库在容器中运行 IRIS,并设置嵌入式 Python 调整所需的所有内容。

环境变量。 嵌入式 Python 需要设置特定的环境变量来连接到 IRIS 并运行 Python 脚本。 下面是 dockerfile 中有帮助的设置:

# init Python env
ENV PYTHON_PATH=/usr/irissys/bin/irispython
ENV SRC_PATH=/irisrun/repo
ENV IRISUSERNAME "SuperUser"
ENV IRISPASSWORD "SYS"
ENV IRISNAMESPACE "USER"

此外,嵌入式 Python 需要将 CallIn 服务设为“on”,此操作在构建 docker 的阶段在 iris.script 中完成:

<span class="hljs-comment">; enabling callin for Embedded Python</span>
    <span class="hljs-keyword">do</span> <span class="hljs-keyword">##class</span>(Security.Services).Get(<span class="hljs-string">"%Service_CallIn"</span>,.prop)
    <span class="hljs-keyword">set</span> prop(<span class="hljs-string">"Enabled"</span>)=<span class="hljs-number">1</span>
    <span class="hljs-keyword">set</span> prop(<span class="hljs-string">"AutheEnabled"</span>)=<span class="hljs-number">48</span>
    <span class="hljs-keyword">do</span> <span class="hljs-keyword">##class</span>(Security.Services).Modify(<span class="hljs-string">"%Service_CallIn"</span>,.prop)

另外,您的解决方案可能需要安装一些 Python 库。 这通过仓库根目录中的 requirements.txt 和 dockerfile 中的 pip3 调用来实现:

pip3 install -r requirements.txt && \

随时可用的 VSCode 开发

使用 docker 在 VSCode 中开发非常方便。 如果想要在 docker IRIS 解决方案中使用嵌入式 Python 进行开发,VSCode 需要切换到 Devcontainer 模式。 为此,将 devcontainer.json 文件添加到 .devcontainer 文件夹中。 该文件描述了需要使用的 docker 服务(本例中为 iris),这可以帮助在 VSCode 中运行 Python 脚本,这些脚本将由在容器中运行的 IRIS 使用的 Python 引擎提供服务。 devcontainer.json 文件还有一个部分,其中说明了需要在容器模式下使用哪些扩展:

"extensions": [
        "ms-python.python",
        "ms-python.vscode-pylance",
        "intersystems-community.vscode-objectscript",
        "intersystems.language-server",
        "intersystems-community.servermanager",
        "ms-vscode.docker"
    ],

通过 ZPM 安装嵌入式 Python 解决方案

此模板被设置为“ZPM 优先”开发仓库。 这意味着所有开发代码都已在 module.xml 中介绍,并且每次构建 docker 镜像时都作为 ZPM 模块安装,开发者每次编码时都在 iris.script 中使用以下行开头:

zpm "load /home/irisowner/irisbuild/ -v":1:1

ZPM 模块中还介绍了嵌入式 Python 代码,它通过 FILECOPY 进行安装:

<FileCopy Name="python/" Target="${libdir}python/"/>

此表达式表示,我们想要将所有 Python 脚本打包在仓库中的 /python 文件夹下,并将其安装在目标 IRIS 安装程序的 libdir 的 python/ 文件夹中。 如果将 Python 脚本复制到 ${libdir}python/ 文件夹下,则可以在目标 IRIS 机器中通过 ObjectScirpt 或 Python 对其进行导入调用。

注意: 确保您的文件夹名称唯一,以免意外替换其他 Python 代码。

希望该模板对您有用。 欢迎提供反馈,尤其是拉取请求!

##嵌入式 Python #开发环境 #InterSystems IRIS #VSCode
在 InterSystems Open Exchange 上检查相关应用程序

源 URL:https://cn.community.intersystems.com/post/intersystems-iris-%E5%B5%8C%E5%85%A5%E5%BC%8F-python-%E6%A8%A1%E6%9D%BF