RPA SikuliX を Python3対応に!
SikuliXをPython3対応する方法を調べましたので共有します。
完全に対応はできませんが、プログラミングスキルと留意点を把握していれば、対応可能です!
フリーのRPAソフトであるSikuliXは、画面上の画像を認識して操作することができるツールで、主にスクリプト言語で書かれています。
SikuliXはもともとPython言語のサポートを含んでいますが、これはJythonを介して実現されており、JythonはPython 2系に基づいています。
Python 3への対応は、JythonそのものがPython 3に対応していないため、直接的なアップデートは難しいとされています。
しかし、Python 3への対応を考える場合、以下のような方法が考えられます。
- 他のPython 3対応エンジンへの移行: 例えば、PyJNIusなどのライブラリを使用してJava APIを直接Python 3から呼び出す方法があります。この方法では、SikuliXのJavaライブラリを直接使用し、Python 3スクリプトから操作を行うことができます。
- SikuliX APIのラッパーを作成: Python 3で動作する小さなラッパーを作成し、内部的にはJavaのSikuliX APIを呼び出す形にすることも一つの手です。これにはJNI(Java Native Interface)を利用することが考えられます。
- 代替ツールの検討: SikuliXと同様の機能を持つ他のツールで、Python 3をサポートしているものを検討することも一つの選択肢です。PyAutoGUIなどがその例です。
他のPython 3対応エンジンへの移行
SikuliXをPython 3に対応させるために、PyJNIusを使用してJava APIを直接呼び出す方法について詳細を説明します。
PyJNIusとは?
PyJNIusは、PythonからJavaクラスを直接利用するためのライブラリです。
このライブラリを使用することで、Javaで書かれたライブラリやアプリケーションをPythonから直接呼び出し、操作することが可能になります。
Python 3に完全に対応しており、JavaのオブジェクトをPythonオブジェクトとして扱うことができます。
SikuliX APIをPython 3で使う方法
- 環境設定: まずはJavaとPython 3がインストールされている環境が必要です。加えて、PyJNIusをインストールする必要があります。
- Javaのクラスパス設定: SikuliXのjarファイルをクラスパスに設定することで、PythonスクリプトからSikuliXのクラスをロードできるようにします。
- PyJNIusを使用してSikuliXのAPIを呼び出す:
- PyJNIusを使って、SikuliXで定義されているJavaクラスをPythonからインスタンス化します。
- SikuliXのメソッドを直接Pythonから呼び出して、画面上の要素の認識や操作を行います。
技術的なハードル
- JNI(Java Native Interface)の理解: JavaのAPIをPythonから呼び出すためには、JNIに関する基本的な理解が必要です。JNIを介することで発生するパフォーマンスのオーバーヘッドや、データ型の変換に注意が必要です。
- エラーハンドリング: JavaとPython間でのエラーハンドリングが複雑になる可能性があります。Javaで発生した例外をPythonで適切に扱う必要があります。
コンバートボリューム
- コードの変換: 既存のSikuliXスクリプト(Python 2ベース)をPython 3に書き直す際、基本的な文法の変更だけでなく、API呼び出しの変更も必要になるため、それなりの作業ボリュームがあります。
- テストとデバッグ: 新しい環境でのテストとデバッグには、相応の時間と労力が必要です。特に、GUI自動化ツールであるため、環境による挙動の違いも考慮する必要があります。
この方法は、技術的な挑戦はありますが、Python 3でのSikuliXの利用を可能にする有効な手段です。APIの呼び出し方やデータの扱い方に慣れれば、Python 3の強力な機能とSikuliXの便利さを組み合わせることができます。
SikuliX APIをPython 3で使うために、PyJNIusを利用した具体的な手順とサンプルコードを以下に示します。
前提条件
- Javaがインストールされていることを確認します。
- SikuliXのjarファイルが必要です(
sikulixapi.jar
など)。 - Python 3がインストールされていること。
- PyJNIusがインストールされていること(
pip install pyjnius
でインストール可能)。
環境設定
- Javaのクラスパスの設定: SikuliXのjarファイルをクラスパスに含める必要があります。これは環境変数を設定するか、Pythonスクリプト内で直接設定できます。
1import os
2# SikuliXのjarファイルのパスを指定
3os.environ['CLASSPATH'] = "/path/to/sikulixapi.jar"
- PyJNIusを用いてSikuliXのクラスをロード:
1from jnius import autoclass
2# SikuliXのScreenクラスをロード
3Screen = autoclass('org.sikuli.script.Screen')
4Pattern = autoclass('org.sikuli.script.Pattern')
サンプルコード
以下はPython 3とPyJNIusを使ってSikuliX APIを操作する簡単な例です。この例では、画面上の特定の画像(”example.png”)を探し、見つかった場合にクリックします。
1from jnius import autoclass
2
3# SikuliXクラスのロード
4Screen = autoclass('org.sikuli.script.Screen')
5Pattern = autoclass('org.sikuli.script.Pattern')
6
7# スクリーンオブジェクトの初期化
8screen = Screen()
9
10# 検索する画像パターンの設定
11image_path = "example.png" # 画像のパスを適宜変更
12pattern = Pattern(image_path)
13
14# 画像をスクリーン上で検索し、見つかればクリック
15try:
16 match = screen.find(pattern) # 画像を検索
17 if match:
18 screen.click(match) # 画像の位置をクリック
19 print("Image found and clicked.")
20 else:
21 print("Image not found.")
22except Exception as e:
23 print(f"An error occurred: {e}")
注意点
- 画像認識に依存するため、解像度やディスプレイの設定によっては認識率が変動します。
- Javaの例外はPythonの例外としてキャッチされるため、適切な例外処理を行うことが重要です。
- 環境によっては追加の環境設定が必要になる場合があります。
このようにPyJNIusを使用することで、Python 3からSikuliXのJava APIを直接利用でき、GUIテストや自動化が行えます。
SikuliX APIのラッパーを作成
SikuliXのJava APIを直接使うために、Python 3で動作するラッパーを作成するアプローチについて詳しく説明します。
この方法は、JavaのクラスとメソッドをPythonから呼び出すためのインターフェースとして機能するラッパーを作成することに焦点を当てています。
ラッパー作成の基本的なアイデア
このアプローチでは、SikuliXのJava APIに対してPython 3のラッパークラスを作成します。これにより、Python 3のコード内で直感的にSikuliXの機能を利用できるようになります。JNI(Java Native Interface)やPyJNIusなどのツールを使用してJavaメソッドを呼び出します。
技術的な実装手順
- 環境設定:
- JavaとPython 3がインストールされていることを確認します。
- 必要に応じてPyJNIusをインストールします。
- Javaクラスのロード:
- PyJNIusを使用して、SikuliXのJava APIにアクセスするためのクラスをロードします。
- ラッパークラスの作成:
- Pythonクラスを定義し、そのメソッド内でJavaのAPIを呼び出します。
- 例えば、スクリーンのキャプチャ、画像のクリック、テキストの入力などの機能をPythonメソッドとして定義します。
サンプルコード(ラッパークラス)
1from jnius import autoclass
2
3class SikuliXWrapper:
4 def __init__(self):
5 self.Screen = autoclass('org.sikuli.script.Screen')
6 self.screen = self.Screen()
7
8 def find_and_click(self, image_path):
9 Pattern = autoclass('org.sikuli.script.Pattern')
10 pattern = Pattern(image_path)
11 try:
12 match = self.screen.find(pattern)
13 if match:
14 self.screen.click(match)
15 print("Image found and clicked.")
16 else:
17 print("Image not found.")
18 except Exception as e:
19 print(f"An error occurred: {e}")
20
21# 使用例
22wrapper = SikuliXWrapper()
23wrapper.find_and_click("example.png")
技術的なハードル
- JNIの理解: JNIを介したJavaとPython間のインタラクションの理解が必要です。型の変換やメモリ管理に注意が必要です。
- エラーハンドリング: Javaの例外を適切に処理し、Pythonの例外として適切に再定義する必要があります。
コンバートボリューム
- ラッパーの開発: 各Javaメソッドに対応するPythonメソッドを作成するため、APIの範囲に応じて開発量が増加します。
- テストと検証: PythonからのAPI呼び出しで予期しない問題が発生する可能性があります。網羅的なテストが必要です。
このアプローチは、Python 3でSikuliXを使用するための強力な方法を提供しますが、JavaとPythonの両方に精通している必要があり、設計とテストには相応の時間がかかります。
補足
autoclass('org.sikuli.script.Screen')
の部分について、もっと詳しく説明します。これはPyJNIusを使用してJavaのクラスをPythonで使えるようにするための一般的な方法です。
PyJNIusとは何か?
PyJNIusはPythonからJavaのクラスを利用するためのライブラリで、Java Native Interface (JNI) を使っています。このライブラリを使用することで、Javaで書かれたプログラムやライブラリをPythonから直接呼び出すことが可能になります。PyJNIusは、動的にJavaオブジェクトを生成し、そのメソッドを呼び出したり、フィールドにアクセスしたりする機能を提供します。
autoclass
関数
autoclass
はPyJNIusの中核的な関数の一つで、文字列で指定されたJavaクラス名から、そのクラスのPythonラッパーを生成します。生成されたラッパーを通じて、Javaクラスのインスタンスを作成したり、静的メソッドやフィールドにアクセスしたりすることができます。
使用方法
autoclass
の引数には、Javaクラスの完全修飾名(パッケージ名を含む)を指定します。例えば、org.sikuli.script.Screen
はSikuliXのScreenクラスの完全修飾名です。
self.Screen = autoclass('org.sikuli.script.Screen')
の解説
この行は、SikuliXのJava API内にあるScreen
クラスにアクセスするためのPythonラッパーを作成し、それをself.Screen
という名前でクラスの属性に保存しています。これにより、このクラス内の他のメソッドでScreen
クラスのインスタンスを作成するために、繰り返しautoclass
を呼び出す必要がなくなります。
Screen
クラスの使用例
self.Screen()
のように呼び出すことで、JavaのScreen
クラスの新しいインスタンスを作成できます。このインスタンスは、SikuliXの機能を利用して画面上の要素を操作するために使用されます。例えば、画面上の特定の画像を検索したり、マウス操作をシミュレートしたりするために使用します。
総合すると、
self.Screen = autoclass('org.sikuli.script.Screen')
は、SikuliXのScreen
クラスをPythonで扱えるようにするための重要なステップです。この一行により、JavaのクラスがPythonオブジェクトとして使えるようになり、そのメソッドやプロパティにPythonコードからアクセスできるようになります。これがPythonとJavaの橋渡しをするPyJNIusの強力な機能の一例です。
代替ツールの検討
SikuliXと同様の機能を持つ他のツールを検討するという選択肢について詳しく説明します。
これには、Python 3に対応している他の自動化ツールを使用するというアプローチが含まれます。
代表的なツールとしては、PyAutoGUIやAutoItなどがあります。
代替ツールの概要
- PyAutoGUI:
- 概要: PyAutoGUIはPythonで書かれたクロスプラットフォームのGUI自動化ライブラリです。スクリーンショットを取る、マウスやキーボード操作をシミュレートするなどの機能を提供します。
- Python 3対応: Python 3に完全対応しており、pipを通じて簡単にインストールできます。
- AutoIt:
- 概要: AutoItは主にWindows向けのスクリプト言語で、GUI制御を主な機能としています。PythonからはPyAutoItライブラリを通じて操作が可能です。
- Python 3対応: PyAutoItを使用することでPython 3からAutoItの機能を利用できます。
技術的なハードル
- 新しいツールの学習: SikuliXから別のツールへの移行は、新たなAPIや操作方法の学習が必要です。特に、PyAutoGUIやAutoItはSikuliXとは異なるアプローチをとるため、これまでの知識が直接活用できない場合があります。
- 機能の差異: SikuliXは画像ベースの検出が強力ですが、PyAutoGUIやAutoItではこの機能が限定的であるか、別のアプローチが必要になる場合があります。たとえば、PyAutoGUIでは画像の検出機能が基本的ですが、精度や応答速度がSikuliXと比べて劣る可能性があります。
コンバートボリューム
- コードの書き換え: 既存のスクリプトを新しいツールに合わせて書き直す必要があります。これには、基本的な操作から複雑なフローの再設計まで含まれるため、かなりの時間と労力が必要です。
- テストとデバッグ: 新しいツールに書き換えた後、環境に依存する要素が多いGUI自動化の性質上、広範なテストとデバッグが必要になります。特に、異なるOSや画面解像度での動作確認が必要です。
総評
SikuliXの機能をPython 3で利用したい場合、代替ツールへの移行は実現可能なオプションですが、移行には時間と労力がかかります。ただし、このプロセスを通じて最新のPython機能を活用できるようになり、保守性や拡張性が向上する可能性があります。適切なツールを選択し、必要な学習と変換作業を計画的に進めることが重要です。