投稿者

インターシステムズジャパン
記事 Toshihiko Minamoto · 6月 29, 2023 13m read

InterSystems Embedded Python の概要

         

コミュニティの皆さん、こんにちは。
この記事では、InterSystems Embedded Python の使用方法を説明します。以下のトピックが含まれます。

  • 1- Embedded Python の概要
  • 2- Embedded Python の使用方法
    • 2.1- ObjectScript から Python ライブラリを使用する
    • 2.2- Python から InterSystems API を呼び出す
    • 2.3- ObjectScript と Python を同時に使用する
  • 3- Python 組み込み関数の使用
  • 4- Python モジュール/ライブラリ 
  • 5- Embedded Python のユースケース
  • 6- まとめ

では、概要から始めましょう。

 

1- Embedded Python の概要

Embedded Python は、Python 開発者が InterSystems IRIS の全データと全機能に直接アクセスできるようにする、InterSystems IRIS データプラットフォームの機能です。

InterSystems IRIS には、データプラットフォーム内で解釈、コンパイル、および実行される ObjectScript と呼ばれる強力なプログラミング言語が組み込まれています。

ObjectScipt は InterSystems IRIS のコンテキスト内で実行されるため、データプラットフォームのメモリとプロシージャ呼び出しに直接アクセスできます。

Embedded Python は、InterSystems IRIS プロセスコンテキスト内で Python コードを実行を可能にする Python プログラミング言語の拡張機能です。

ObjectScript と Python のいずれも同じオブジェクトメモリで動作するため、Python オブジェクトは ObjectScript オブジェクトを単にエミュレートするのではなく、ObjectScipt オブジェクトであると言えます。

これらの言語の共平等性により、ジョブに最適な言語か、アプリケーションの記述に最も使いやすい言語を選択することができます。

 

2- Embedded Python の使用方法

Embedded Python を使用する場合、3 つの異なる方法でコードを記述できます。

2.1- ObjectScript から Python ライブラリを使用する

まず、通常の .py ファイルを記述し、InterSystems IRIS コンテキストからそれを呼び出します。 この場合、データプラットフォームは Python プロセスを起動し、IRIS と呼ばれるモジュールをインポートできるようにします。これにより、Python プロセスが IRIS カーネルに自動的に接続されるため、Python コードのコンテキストから ObjectScript のすべての機能にアクセスできるようになります。

2.2- Python から InterSystems API を呼び出す

次に、通常の ObjectScript コードを記述し、%SYS.Python パッケージを使って Python オブジェクトをインスタンス化します。 この ObjectScript パッケージを使うと、Python モジュールとライブラリをインストールし、ObjectScript 構文でコードベースを操作できるようになります。
%SYS.Python パッケージを使うと、ObjectScript 開発者は Python の知識が無くてもリッチな Python ライブラリエコシステムを ObjectScript コードで使用できるようになります。

2.3- ObjectScript と Python を同時に使用する

最後に、InterSystems クラス定義を作成し、Python でメソッドを記述します。 そのメソッドを呼び出すと、Python インタープリターが起動します。 このメソッドは、メリットとして、それを含むクラスのインスタンスへの参照を使って、Python コードのそのブロックの self キーワードを埋めることができます。 また、Python を使って InterSystems クラスにクラスメソッドを書き込むことで、SQL で、テーブルに新しい行が追加されたなどの異なるデータエントリイベントを処理するメソッドを簡単に実装できます。
カスタムストアドプロシージャを Python で迅速に開発することも可能です。

ご覧のとおり、Embedded Python を使用すると、パフォーマンスを犠牲にすることなく、ジョブに最適なプログラミング言語を選択できます。

3- Python 組み込み関数の使用

Python インタープリターには、常に利用できる多数の関数と型が組み込まれています。 以下に、アルファベット順でリストしています。

組み込み関数
AELR
abs()enumerate()len()range()
aiter()eval()list()repr()
all()exec()locals()reversed()
any()round()
anext()FM
ascii()filter()map()S
float()max()set()
Bformat()memoryView()setattr()
bin()frozenset()min()slice()
breakpoint()GNstaticmethod()
bytearray()getattr()next()str()
bytes()globals()sum()
Osuper()
CHobject()
callable()hasattr()oct()T
chr()hash()open()tuple()
classmethod()help()ord()type()
compile()hex()
complex()PV
Ipow()vars()
Did()print()
delattr()input()property()Z
dict()int()zip()
dir()isinstance()
divmod()issubclass()-
iter()__import__()

Python 組み込み 関数の使用

Python 組み込み関数を使用するには、"builtins" をインポートする必要があります。その後、関数を呼び出せるようになります。

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

Python の print() 関数は、実際には組み込みモジュールのメソッドであるため、ObjectScript からこの関数を使用できるようになりました。

USER>do builtins.print("hello world!")
hello world!
USER>set list = builtins.list()
 
USER>zwrite list
list=5@%SYS.Python  ; []  ; <OREF>

同様に、help() メソッドを使って、リストオブジェクトのヘルプを取得できます。

USER>do builtins.help(list)
Help on list object:
class list(object)
 |  list(iterable=(), /)
 |
 |  Built-in mutable sequence.
 |
 |  If no argument is given, the constructor creates a new empty list.
 |  The argument must be an iterable if specified.
 |
 |  Methods defined here:
 |
 |  __add__(self, value, /)
 |      Return self+value.
 |
 |  __contains__(self, key, /)
 |      Return key in self.
 |
 |  __delitem__(self, key, /)
 |      Delete self[key].

 

4- Python モジュールまたはライブラリ

一部の Python モジュールまたはライブラリはデフォルトでインストールされるため、すでに利用することができます。 help("module") 関数を使うと、これらのモジュールを表示できます。
Python libraries list output 1

Python モジュールまたはライブラリのインストール

これらのモジュールとは別に、Python には数百ものモジュールとライブラリがあり、pypi.org で確認できます。Python Package Index(PyPI)は Python プログラミング言語のソフトウェアリポジトリです)

他のライブラリが必要な場合は、intersystems irispip コマンドを使ってライブラリをインストールする必要があります。

たとえば、Pandas は Python データ分析ライブラリです。 以下のコマンドは、パッケージインストーラーの irispip を使用して、Windows システムに Pandas をインストールします。

C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python pandas

C:\InterSystems は InterSystems インストールディレクトリに置き換えられることに注意してください。

5- Embedded Python のユースケース

5.1- Python Reportlab ライブラリを使った PDF の印刷

irispip コマンドを使用して Reportlab ライブラリをインストールしてから、objectscript 関数を作成します。

ファイルの場所を指定すると、以下の CreateSamplePDF() という ObjectScript メソッドによって、サンプル 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 が生成され、指定された場所に保存されます。
InterSystems ロゴ、Python ロゴ、および InterSystems and Python のテキストを含む 1 ページ PDF。 併用による完璧な機能。

 

5.2- Python Qrcode ライブラリを使った QR コードの生成

QR コードを生成するには、irispip コマンドを使用して Qrcode ライブラリをインストールする必要があります。次に、以下のコードを使用すると、QR コードを生成できます。

 

5.3- Python Folium ライブラリを使った地理的位置情報の取得

地理データを取得するには、irispip コマンドを使用して Folium ライブラリをインストールする必要があります。次に、以下の objectscript 関数を作成します。

Class dc.IrisGeoMap.Folium Extends%SwizzleObject
{

// Function to print Latitude, Longitude and address details ClassMethod GetGeoDetails(addr As%String) [ Language = python ]
{
    from geopy.geocoders import Nominatim
    geolocator = Nominatim(user_agent="IrisGeoApp")
    try:
        location = geolocator.geocode(addr)
        print("Location:",location.point)
        print("Address:",location.address)
        point = location.point
        print("Latitude:", point.latitude)
        print("Longitude:", point.longitude)
    except:
        print("Not able to find location")
}
}

IRIS ターミナルに接続して以下のコードを実行します

do ##class(dc.IrisGeoMap.Folium).GetGeoDetails("Cambridge MA 02142")

以下が出力されます。

画像

 

5.4- Python Folium ライブラリを使ったインタラクティブ地図への場所の生成とマーキング

同じ Python Folium 伊良部らりを使用して、インタラクティブ地図に場所を生成し、それをマーキングします。以下の objectsctipt 関数によって、これを実行します。

ClassMethod MarkGeoDetails(addr As%String, filepath As%String) As%Status [ Language = python ]
{
    import folium
    from geopy.geocoders import Nominatim
    
    geolocator = Nominatim(user_agent="IrisGeoMap")
    #split address in order to mark on the map
    locs = addr.split(",")
    if len(locs) == 0:
        print("Please enter address")
    elif len(locs) == 1:
        location = geolocator.geocode(locs[0])
        point = location.point
        m = folium.Map(location=[point.latitude,point.longitude], tiles="OpenStreetMap", zoom_start=10)
    else:
        m = folium.Map(location=[20,0], tiles="OpenStreetMap", zoom_start=3)
    
    for loc in locs:
        try:
            location = geolocator.geocode(loc)
            point = location.point
            folium.Marker(
                    location=[point.latitude,point.longitude],
                    popup=addr,
                ).add_to(m)         
        except:
            print("Not able to find location : ",loc) 
              
    map_html = m._repr_html_()
    iframe = m.get_root()._repr_html_()
    fullHtml = """
             
                
                    
                     """
    fullHtml = fullHtml + iframe            
    fullHtml = fullHtml + """                                             
                
                
    """try:
        f = open(filepath, "w")
        f.write(fullHtml)
        f.close()
    except:
        print("Not able to write to a file")
}

IRIS ターミナルに接続し、MarkGeoDetails 関数を呼び出します

dc.IrisGeoMap.Folium クラスの MarkGeoDetails() 関数を呼び出します。
この関数には、以下の 2 つのパラメーターが必要です。

  1. 場所("," 区切りで、複数の場所を渡すことができます)
  2. HTML ファイルパス

以下のコマンドを実行し、地図に Cambridge MA 02142、NY、London、UAE、Jeddah、Lahore、および Glasgow の場所をマークして、 "irisgeomap_locations.html" ファイルとして保存します。

do ##class(dc.IrisGeoMap.Folium).MarkGeoDetails("Cambridge MA 02142,NY,London,UAE,Jeddah,Lahore,Glasgow","d:\irisgeomap_locations.html")

上記のコードによって、以下のインタラクティブ HTML ファイルが生成されます。

画像

 

5.5- Python Pandas ライブラリを使ったデータ分析

irispip コマンドを使用して Pnadas ライブラリをインストールする必要があります。次に、以下のコードを使用すると、データが表示されます。

 

6- まとめ

InterSystems Embedded Python(IEP)は、Python コードと InterSytems アプリケーションをシームレスに統合できる強力な機能です。 IEP を使用すると、Python で利用可能な広範なライブラリとフレームワークを活用して、InterSystems アプリケーションの機能を強化できます。 この記事では、IEP の主な機能とメリットを説明しました。

IEP は、InterSystems アプリケーション内から Python オブジェクトを操作し、Python コードを実装できるようにする一連のライブラリとして実装されています。 これにより、単純で有効な方法によって、Python コードを InterSystems アプリケーションに統合できるため、データ分析、機械学習、自然言語処理など、InterSystems ObjectScript での実装が困難なタスクを実行できるようになります。

IEP を使用する主なメリットの 1 つには、Python と InterSysems の間のギャップのかけ渡しを得られることが挙げられます。 このため、両方の言語の持つ力を使って、両分野の長所を組み合わせた強力なアプリケーションを作成しやすくなります。

IEP には、Python の機能を活用して、InterSystems アプリケーションの機能を拡張する方法も備わっています。 つまり、InterSystems ObjectScript で実装するには困難なタスクに、Python で利用できる膨大な数のライブラリをフレームワークを利用して実行できます。

InterSystems Embedded Python には、Python の機能を活用して、InterSystems アプリケーションの機能を拡張する強力な方法が備わっています。 Python コードを InterSystems アプリケーションに統合することで、Python で利用できる膨大な数のライブラリとフレームワークを利用し、InterSystems ObjectScript での実装が困難な複雑なタスクを実行できます。

以上です!