第二章 嵌入式Python概述(二)
第二章 嵌入式Python概述(二)
从 Python 调用 IRIS API
如果使用的是嵌入式 Python
并且需要与 IRIS
交互,可以使用 Python shell
中的 iris
模块,或者使用 Python
编写的 IRIS
类中的方法。要遵循本节中的示例,可以使用 ObjectScript
命令 do ##class(%SYS.Python).Shell()
从终端会话启动 Python shell
。
当启动终端会话时,将被放置在 IRIS
的 USER
命名空间中,将看到提示 USER>
。但是,如果从 GitHub
加载了示例类,则需要在 SAMPLES
命名空间中才能访问它们。
在终端中,更改为 SAMPLES
命名空间,然后启动 Python shell
,如下所示:
USER>set $namespace = "SAMPLES"
SAMPLES>do ##class(%SYS.Python).Shell()
Python 3.9.5 (default, Jul 19 2021, 17:50:44) [MSC v.1927 64 bit (AMD64)] on win32
Type quit() or Ctrl-D to exit this shell.
>>>
当从终端会话启动 Python shell
时,Python shell
继承与终端相同的上下文,例如,当前命名空间和用户。局部变量不被继承。
使用类
要从 Python
访问 IRIS
类,请使用 iris
模块来实例化要使用的类。然后,可以像访问 Python
类一样使用访问它的属性和方法。
注意:可能习惯于在 Python
中导入模块,然后再使用它,例如:
>>> import iris
但是,在使用 %SYS.Python
类的 Shell()
方法运行 Python shell
时,不需要显式导入 iris
模块。继续使用该模块。
以下示例使用系统类 %Library.File
的 ManagerDirectory()
方法打印 IRIS
管理器目录的路径:
>>> lf = iris.cls('%Library.File')
>>> print(lf.ManagerDirectory())
C:\InterSystems\IRIS\mgr\
此示例使用系统类 %SYSTEM.CPU
的 Dump()
方法来显示有关正在运行 IRIS
实例的服务器的信息:
>>> cpu = iris.cls('%SYSTEM.CPU')
>>> cpu.Dump()
-- CPU Info for node MYSERVER ----------------------------------------------
Architecture: x86_64
Model: Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz
Vendor: Intel
# of threads: 4
# of cores: 2
# of chips: 1
# of threads per core: 2
# of cores per chip: 2
MT supported: 1
MT enabled: 1
MHz: 2904
------------------------------------------------------------------------------
此示例使用 GitHub
上 Samples-Data
存储库中的 Sample.Company
类。虽然可以使用任何命名空间中以百分号 (%
) 开头的类(如 %SYS.Python
或 %Library.File
)来访问 Sample.Company
类,但如前所述,必须位于 SAMPLES
命名空间中。
Sample.Company
的类定义如下:
Class Sample.Company Extends (%Persistent, %Populate, %XML.Adaptor)
{
/// The company's name.
Property Name As %String(MAXLEN = 80, POPSPEC = "Company()") [ Required ];
/// The company's mission statement.
Property Mission As %String(MAXLEN = 200, POPSPEC = "Mission()");
/// The unique Tax ID number for the company.
Property TaxID As %String [ Required ];
/// The last reported revenue for the company.
Property Revenue As %Integer;
/// The Employee objects associated with this Company.
Relationship Employees As Employee [ Cardinality = many, Inverse = Company ];
}
此类扩展 %Library.Persistent
(通常缩写为 %Persistent
),这意味着此类的对象可以持久保存在 IRIS
数据库中。该类还具有多个属性,包括 Name
和 TaxID
,这两个属性都是保存对象所必需的。
尽管不会在类定义中看到它们,但持久类带有许多用于操作此类对象的方法,例如 %New()
、%Save()
、%Id()
和 %OpenId()
。但是,Python
方法名称中不允许使用百分号 (%
),因此请改用下划线 (_
)。
下面的代码创建一个新的 Company
对象,设置所需的 Name
和 TaxID
属性,然后将公司保存在数据库中:
>>> myCompany = iris.cls('Sample.Company')._New()
>>> myCompany.Name = 'Acme Widgets, Inc.'
>>> myCompany.TaxID = '123456789'
>>> status = myCompany._Save()
>>> print(status)
1
>>> print(myCompany._Id())
22
上面的代码使用 _New()
方法创建类的实例,并使用 _Save()
将实例保存在数据库中。 _Save()
方法返回一个状态码。在这种情况下,1
表示保存成功。当保存一个对象时, IRIS
会为其分配一个唯一 ID
,可以在以后使用该 ID
从存储中检索该对象。 _Id()
方法返回对象的 ID
。
使用类的 _OpenId()
方法将对象从持久存储中检索到内存中进行处理:
>>> yourCompany = iris.cls("Sample.Company")._OpenId(22)
>>> print(yourCompany.Name)
Acme Widgets, Inc.
将以下代码添加到类定义中会创建一个 Print()
方法,该方法打印当前公司的 Name
和 TaxID
。将 Language
关键字设置为 python
会告诉类编译器该方法是用 Python
编写的。
Method Print() [ Language = python ]
{
print ('\nName: ' + self.Name + ' TaxID: ' + self.TaxID)
}
给定一个 Company
对象,可以调用它的 Print()
方法,如下所示:
>>> yourCompany.Print()
Name: Acme Widgets, Inc. TaxID: 123456789