RPA

RPA SikuliX を Python3対応に!

k.w

SikuliXをPython3対応する方法を調べましたので共有します。
完全に対応はできませんが、プログラミングスキルと留意点を把握していれば、対応可能です!

フリーのRPAソフトであるSikuliXは、画面上の画像を認識して操作することができるツールで、主にスクリプト言語で書かれています。

SikuliXはもともとPython言語のサポートを含んでいますが、これはJythonを介して実現されており、JythonはPython 2系に基づいています。

Python 3への対応は、JythonそのものがPython 3に対応していないため、直接的なアップデートは難しいとされています。

しかし、Python 3への対応を考える場合、以下のような方法が考えられます。

  1. 他のPython 3対応エンジンへの移行: 例えば、PyJNIusなどのライブラリを使用してJava APIを直接Python 3から呼び出す方法があります。この方法では、SikuliXのJavaライブラリを直接使用し、Python 3スクリプトから操作を行うことができます。
  2. SikuliX APIのラッパーを作成: Python 3で動作する小さなラッパーを作成し、内部的にはJavaのSikuliX APIを呼び出す形にすることも一つの手です。これにはJNI(Java Native Interface)を利用することが考えられます。
  3. 代替ツールの検討: 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で使う方法

  1. 環境設定: まずはJavaとPython 3がインストールされている環境が必要です。加えて、PyJNIusをインストールする必要があります。
  2. Javaのクラスパス設定: SikuliXのjarファイルをクラスパスに設定することで、PythonスクリプトからSikuliXのクラスをロードできるようにします。
  3. 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"
ダウンロードはこちらから
sikulixapi.jarのダウンロードはSikuliXサイトから!
sikulixapi.jarのダウンロードはSikuliXサイトから!
  • 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メソッドを呼び出します。

技術的な実装手順

  1. 環境設定:
    • JavaとPython 3がインストールされていることを確認します。
    • 必要に応じてPyJNIusをインストールします。
  2. Javaクラスのロード:
    • PyJNIusを使用して、SikuliXのJava APIにアクセスするためのクラスをロードします。
  3. ラッパークラスの作成:
    • 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などがあります。

代替ツールの概要

  1. PyAutoGUI:
    • 概要: PyAutoGUIはPythonで書かれたクロスプラットフォームのGUI自動化ライブラリです。スクリーンショットを取る、マウスやキーボード操作をシミュレートするなどの機能を提供します。
    • Python 3対応: Python 3に完全対応しており、pipを通じて簡単にインストールできます。
  2. 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機能を活用できるようになり、保守性や拡張性が向上する可能性があります。適切なツールを選択し、必要な学習と変換作業を計画的に進めることが重要です。

ABOUT ME
記事URLをコピーしました