Skip to content

UiPathのPython連携アクティビティを開発する

Posted in ノート

Last updated on 2022年8月9日

最近Pythonを利用して、画像処理やAモデルの開発を行うことが多いのですが、自動化の延長としてUiPathから呼び出せたら便利だなとふと思いました。

そこで実際に、カスタムアクティビティ開発を行いPythonを実行することができたので紹介となります。


UiPathとPythonで書いたコードを連携させたいなぁ

作ればいいじゃないかにゃ?!


カスタムアクティビティの開発については、下記の記事で書いてますので参考にしてみてください。

今回開発したもの

開発したものですが、Pythonコードを実行しその標準出力を受け取るカスタムアクティビティです。

標準出力と書いてますが、Pythonであれば、print 関数を用いたその出力結果です。

まず、コードを記載します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Activities;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;

namespace Python_Connect_Activity
{
    public class Connect_Python : CodeActivity
    {
        [Description("Python.exeのパス")]
        [Category("Input")]
        [RequiredArgument]
        public InArgument<String> PythonExePath { get; set; }

        [Description("実行するPythonファイルのパス")]
        [Category("Input")]
        [RequiredArgument]
        public InArgument<String> PythonScriptPath { get; set; }

        [Description("アウトプット")]
        [Category("Output")]
        [RequiredArgument]
        public OutArgument<String> OutPutText { get; set; }

        [Description("リザルト エラー有:True エラー無:False")]
        [Category("Result")]
        [RequiredArgument]
        public OutArgument<Boolean> Result { get; set; }

        protected override void Execute(CodeActivityContext context)
        {
            string pythonExePath = PythonExePath.Get(context);
            string pythonScriptPath = PythonScriptPath.Get(context);

            // Processの出力を首取得
            string outputText = string.Empty;
            // 使用しないが拡張のため定義
            string standardError = string.Empty;
            // エラー発生時はこちらを出力にセット
            string exceptionMessage = string.Empty;
            // Processの実行結果 エラー有:True エラー無:False
            boolen isError = false;

            try
            {
                using (Process process = new Process())
                {
                    process.StartInfo = new ProcessStartInfo(pythonExePath)
                    {
                        Arguments = pythonScriptPath,
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true,
                        CreateNoWindow = true
                    };
                    process.Start();
                    outputText = process.StandardOutput.ReadToEnd();
                    standardError = process.StandardError.ReadToEnd();
                    process.WaitForExit();
                }
            }
            catch (Exception ex)
            {
                exceptionMessage = ex.Message;
                isError = true;
            }

            Result.Set(context, isError);
            if(isError){
              OutPutText.Set(context, exceptionMessage);
            }else{
              OutPutText.Set(context, outputText);
            }
        }
    }
}

上記のコードは、UiPathのカスタムアクティビティ開発の際に、Visual Studioに記述したものをそのまま記載しています。

(実際の利用イメージは、本記事の下のほうに貼っております)

コード上、C#で行っている処理内容ですが、System.DiagnosticsにあるProcessStartInfoクラスを使って起動するプログラム(Python.exe)の設定をし、System.Diagnosticsにある、ProcessクラスのStartメソッドを使い外部プログラムを起動しているのみとなります。

あわせて、標準出力を得るため、Process.StandardOutput よりアプリケーションの標準出力を受け取っています。

引数としては、Python.exeのパス、実行するpythonスクリプトのパス、そして実行結果をうけとる String型の変数を定義しています。

注意点として、実行環境上には、あらかじめ Pythonをセットアップしておく必要があります。


実行してみる

コードのみではイメージがわかないと思いますので開発したものを実行してみたいと思います。

まず全体イメージです。

中央にある「Connect Python」と青くなっているアクティビティが開発したカスタムアクティビティです。

プロパティには、Python.exeのパスと実行するPythonスクリプトを設定しています。

そして、受け取った結果を【メッセージボックス】を利用し表示するようにしてみます。

ちなみに、今回実行するPythonスクリプトは非常にシンプルで下記となっています。

print("Hello World!! from Epic Life")

では実行してみます。

実行!

しっかり値を受け取ることができました。


<参考>UiPath.Python.Activites

UiPathからPythonの連携アクティビティがパッケージとして提供されています。


最後に


今回このようなアクティビティを作ってみたのも、Pythonであれば簡単に実装できるがVBAやC++ではちょっと。。。という問題を解決しすぐにUiPathとPythonで自動化の検証を行いたいと思ったのがきっかけした。
あまりニーズはないと思いますが手軽で作れたので興味のある方は参考にしてみてください。

今回も最後までお読みいただきありがとうございます。

では。

Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。