ObjectScript からの組み込み Python コードの呼び出し
このセクションでは、ObjectScript から組み込み Python コードを呼び出すいくつかの方法を説明します。
ObjectScript コードを呼び出すのとほとんど同じ方法で Python コードを呼び出せる場合もありますが、%SYS.PythonOpens in a new tab クラスを使用して 2 つの言語間のギャップを埋める必要がある場合もあります。詳細は、"ObjectScript と組み込み Python 間のギャップを埋める" を参照してください。
Python ライブラリの使用
組み込み Python では、何千もの便利なライブラリに簡単にアクセスできます。一般に "パッケージ" と呼ばれますが、これらは使用する前に Python Package Index (PyPIOpens in a new tab) から <installdir>/mgr/python ディレクトリにインストールする必要があります。
例えば、ReportLab Toolkit は、PDF およびグラフィックを生成するためのオープン・ソース・ライブラリです。以下のコマンドでは、パッケージ・インストーラ irispip を使用して Windows システムに ReportLab をインストールします。
C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python reportlab
UNIX ベースのシステムでは (AIX を除く)、以下を使用します。
$ python3 -m pip install --target /InterSystems/IRIS/mgr/python reportlab
InterSystems IRIS をコンテナで実行している場合は、"コンテナへの Python パッケージのインストール" を参照してください。
InterSystems IRIS を AIX で実行している場合は、"AIX への Python パッケージのインストール" を参照してください。
パッケージをインストールしたら、%SYS.PythonOpens in a new tab クラスの Import() メソッドにより、それを ObjectScript コードで使用できます。
ファイルの場所を指定すると、以下の ObjectScript メソッド CreateSamplePDF() は、サンプルの 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()
}
}
このメソッドの最初の行は、ReportLab の pdfgen サブパッケージから canvas.py ファイルをインポートします。コードの 2 番目の行は Canvas オブジェクトをインスタンス化し、その後続行して、InterSystems IRIS オブジェクトのメソッドを呼び出すのとほぼ同じ方法でそのメソッドを呼び出します。
その後、以下に示すように通常の方法でメソッドを呼び出せます。
do ##class(Demo.PDF).CreateSamplePDF("C:\Sample\hello.pdf")
以下の PDF が生成され、指定された場所に保存されます。
![インターシステムズのロゴ、Python のロゴ、および InterSystems IRIS and Python.Perfect Together. というテキストを示す 1 ページの PDF。](images/gepython_pdf.png)
Python で記述された InterSystems IRIS クラス内でのメソッドの呼び出し
組み込み Python を使用して InterSystems IRIS クラスでメソッドを記述し、その後 ObjectScript で記述されたメソッドを呼び出すのと同じ方法で、ObjectScript からそのメソッドを呼び出すことができます。
次の例は usaddress-scourgify ライブラリを使用しています。このライブラリは Windows のコマンド行から以下のようにインストールできます。
C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python usaddress-scourgify
UNIX ベースのシステムでは (AIX を除く)、以下を使用します。
$ python3 -m pip install --target /InterSystems/IRIS/mgr/python usaddress-scourgify
InterSystems IRIS をコンテナで実行している場合は、"コンテナへの Python パッケージのインストール" を参照してください。
InterSystems IRIS を AIX で実行している場合は、"AIX への Python パッケージのインストール" を参照してください。
以下のデモ・クラスには、米国の住所の各部分のプロパティと、Python で記述されたメソッドが含まれます。これは、usaddress-scourgify を使用して住所をアメリカ合衆国郵便公社の標準に従って正規化します。
Class Demo.Address Extends %Library.Persistent
{
Property AddressLine1 As %String;
Property AddressLine2 As %String;
Property City As %String;
Property State As %String;
Property PostalCode As %String;
Method Normalize(addr As %String) [ Language = python ]
{
from scourgify import normalize_address_record
normalized = normalize_address_record(addr)
self.AddressLine1 = normalized['address_line_1']
self.AddressLine2 = normalized['address_line_2']
self.City = normalized['city']
self.State = normalized['state']
self.PostalCode = normalized['postal_code']
}
}
住所の文字列を入力として指定すると、クラスの Normalize() インスタンス・メソッドは、住所を正規化し、各部分を Demo.Address オブジェクトのさまざまなプロパティに格納します。
このメソッドは以下のように呼び出せます。
USER>set a = ##class(Demo.Address).%New()
USER>do a.Normalize("One Memorial Drive, 8th Floor, Cambridge, Massachusetts 02142")
USER>zwrite a
a=3@Demo.Address <OREF>
+----------------- general information ---------------
| oref value: 3
| class name: Demo.Address
| reference count: 2
+----------------- attribute values ------------------
| %Concurrency = 1 <Set>
| AddressLine1 = "ONE MEMORIAL DR"
| AddressLine2 = "FL 8TH"
| City = "CAMBRIDGE"
| PostalCode = "02142"
| State = "MA"
+-----------------------------------------------------
Python で記述された SQL 関数またはストアド・プロシージャの実行
組み込み Python を使用して SQL 関数またはストアド・プロシージャを作成する際、InterSystems IRIS は、他のメソッドを呼び出すのと同じように ObjectScript から呼び出せるメソッドを持つクラスを投影します。
例えば、このドキュメントで前述した例に示す SQL 関数は、tzconvert() メソッドを持つクラス User.functzconvert を生成します。これを ObjectScript から呼び出すには、以下のようにします。
USER>zwrite ##class(User.functzconvert).tzconvert($zdatetime($h,3),"US/Eastern","UTC")
"2021-10-20 15:09:26"
ここでは、$zdatetime($h,3) を使用して現在の日付と時刻が $HOROLOG 形式から ODBC 日付形式に変換されます。
任意の Python コマンドの実行
組み込み Python コードを開発またはテストしている際、任意の Python コマンドを ObjectScript から実行すると都合がよい場合があります。これは、%SYS.PythonOpens in a new tab クラスの Run() メソッドによって行えます。
例えば、このドキュメントの前半で使用した usaddress_scourgify パッケージからの normalize_address_record() 関数をテストしたいのに、その動作を思い出せない場合があるかもしれません。%SYS.Python.Run() メソッドを使用して、以下のようにターミナルから関数のヘルプを出力できます。
USER>set rslt = ##class(%SYS.Python).Run("from scourgify import normalize_address_record")
USER>set rslt = ##class(%SYS.Python).Run("help(normalize_address_record)")
Help on function normalize_address_record in module scourgify.normalize:
normalize_address_record(address, addr_map=None, addtl_funcs=None, strict=True)
Normalize an address according to USPS pub. 28 standards.
Takes an address string, or a dict-like with standard address fields
(address_line_1, address_line_2, city, state, postal_code), removes
unacceptable special characters, extra spaces, predictable abnormal
character sub-strings and phrases, abbreviates directional indicators
and street types. If applicable, line 2 address elements (ie: Apt, Unit)
are separated from line 1 inputs.
.
.
.
%SYS.Python.Run() メソッドは、成功した場合に 0 を返し、失敗した場合に -1 を返します。