UiPathからPythonスクリプトを呼び出す
RPAエンジニア 小林
UiPathは自動化のための様々な機能を備えていますが、フローの中で複雑な計算やAPI連携などをしたいときに、「ここだけPythonで処理できると楽だな」と思う場面があります。今回は、UiPathでPythonスクリプトを扱うためのアクティビティについて紹介します。
準備
まず、前提としてマシンにはPythonがインストールされている必要があります。その上で、UiPathからPythonを実行するためにUiPath.Python.Activitesをインストールします。このパッケージはUiPath Studioのパッケージマネージャーからインストールすることができます。
パッケージをインストールできたら、Pythonスクリプトを用意します。今回は以下のようなコードが書かれたファイル「my_methods.py」で試してみます。ここではシンプルな例として関数1つを扱っていますが、複数の関数が記述されていてもかまいません。呼び出したい関数はUiPath側で指定することができます。例として扱うrepeat_string関数は、引数sとして受け取った文字列を引数nで指定された回数だけ繰り返した文字列を返す関数です。
def repeat_string(s, n):
result = s * n
return result
Pythonアクティビティの使い方
UiPath.Python.Activitesをインストーして導入した各種Pythonアクティビティを使ってワークフローを組み立てていきます。構成としては、Pythonスコープ(UiPath.Python.Activities.PythonScope)の中に、Pythonスクリプトをロード(UiPath.Python.Activities.LoadScripts)、Pythonメソッドの呼び出し(UiPath.Python.Activities.InvokeMethid)、Pythonのオブジェクトを取得(UiPath.Python.Activities.GetObject)のアクティビティを順に配置します。
まず、Pythonスコープのプロパティで、「パス」にPythonの実行ファイル(python.exe)が保存されているフォルダを指定します。「WorkingFolder」にはPythonを実行したいフォルダを指定します。今回は作成しているプロジェクトと同じフォルダに指定しています。「ターゲット」は扱うPythonか32bit版か64bit版かによって切り替えます。今回扱っている例では32bit版Pythonを使って実行したのでx86を指定していますが、64bit版Pythonを使う場合はx64を指定してください。
Pythonスクリプトをロードのアクティビティでは、Pythonスクリプトを読み込んでPythonObjectとして出力します。プロパティの「ファイル」に読み込みたいPythonスクリプトファイルのパスを設定します。結果はPythonObject型の変数として出力され、この変数を使ってこの後の処理が行われます。
Pythonメソッドの呼び出しアクティビティでは、上記Pythonスクリプトをロードで読み込ませたPythonスクリプト内の関数を呼び出すことができます。プロパティの「インスタンス」に上記で取得したPythonObject型変数を設定し、「名前」には呼び出したい関数の名前を入力します。入力パラメータには関数に渡したい引数を{}で列挙して入力します(正確にはIEnumrable型の変数)。図の例のように{"abc", 3}と設定すると、Python関数の第1引数sに文字列「abc」、第2引数nに整数「3」が渡されます。結果にはPythonObject型の変数を設定します。
Pythonのオブジェクトを取得アクティビティでは、上記メソッドの呼び出しで取得したPythonObject変数を入力プロパティに設定します。TypeArgumentには、Python関数の戻り値として期待される型を指定し、出力プロパティにはその型の変数を設定します。今回例として扱っている関数はstr型(UiPathのString型に相当)を返すので設定する型はStringです。
これですべて設定はできたので、実際にStr_Resultの値を出力してみると「abc」を3繰り返した文字列「abcabcabc」が出力されており、Pythonスクリプトの関数が実行されたことが分かります。
エラーの扱い
最後に、エラーが起きた場合の処理について考えてみます。上記例ではPythonスクリプトが正しく実行されることが確認されましたが、状況によってはエラーが生じることもあります。例えば上記Pythonメソッドの呼び出しアクティビティからrepeat_string関数を呼び出し、繰り返し回数(第2引数)に整数でない値を入れて実行してみると、エラーが生じて処理が止まってしまいます。
Python側で起きたエラーをUiPathのエラー画面だけから読み解こうとすると複雑なので、Pythonのエラー内容をUiPathに渡せるようにしておいたほうが問題を切り分けやすくなります。例えば次のコードのようにtracebackモジュールを用いて、結果と一緒にトレースバックを返すようにしておけば、UiPath側でPythonのトレースバックの内容を変数として受け取れます。
import traceback
def repeat_string(s, n):
result = ""
error = ""
try:
result = s * n
except Exception:
error = traceback.format_exc()
return result, error
この例のように実装した場合、関数の戻り値は2つになります。戻り値が複数ある関数の場合、UiPath側では配列変数で受け取ることができます。今回の例では戻り値は2つとも文字列なので、String型の配列で実行結果を受け取ります。戻り値に異なる型が混在する場合はObject型の配列で受け取ることができます。
あとは、トレースバックの内容によって例外をスローしたり、ログとして出力した上で処理を継続したりするなど、目的に応じた例外処理をすると良いでしょう。
今回は、UiPathからPythonスクリプトを呼び出す方法を紹介しました。UiPathとPythonはそれぞれ得意とする領域が異なります。例えばUI操作の自動化であればUiPathのほうが簡単に実現できますし、複雑な計算をしたい場合はPythonでスクリプトを書いてしまったほうが扱いやすいでしょう。また、作りたい処理に関連するツールを探す際、UiPathパッケージにはないがPythonライブラリにはある(またはその逆)という場合もあります。そのような両者を連携することで今まで一方だけでは難しいと思っていた自動化を実現できるかもしれません。UiPathとPythonの長所をうまく組み合わせて、自動化の幅を広げていきたいですね。