我個人覺得UiPath不是一個很無敵的工具,在使用UiPath一段時間後發現它還是有很多功能上的限制(可能是本身產品開發功能還沒補全或或多或少會有一些Bug)
有可能有版本上的問題(每個版本相容性易出問題)、有可能是擴充模組本身的錯誤,在近期的工作中就發現了此python擴充套件上的不足,依照自身情況記錄下來。
根據上一篇【Uipath教學】UiPath 整合 Python 腳本:提升 RPA 處理能力與流程彈性 我有介紹到UiPath有提供Python的套件,讓使用者可以呼叫Python相關的程式碼做更好的整合,但最近在使用上發現到一個蠻嚴重的問題,而剛好在上一篇最後也有提到將會介紹另一種呼叫腳本的用法,將會集中在這篇文章詳細解說。
UiPath Python擴充套件之限制:不接受OOP(物件導向)呼叫,只能呼叫Python的function。
使用python程式語言,很多人會依賴python的物件導向寫法,例如我有一個Animal.py裡面定義動物的方法,有一個speak的功能。
Animal.py
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
return "I am an animal."
而在另一支程式碼main.py,我想要呼叫這個Animal class
from Animal import Animal
def main():
try:
my_animal = Animal("Buddy", 5)
rs = my_animal.speak()
print(rs)
return rs
except Exception as e:
print(f"An error occurred: {e}")
return f"An error occurred: {e}"
if __name__ == "__main__":
main()
在終端機測試時,可以看到他順利的印出,"I am an animal."的字樣。

但當使用UiPath呼叫這個main時就會發生錯誤訊息,Load不到python script。(已測試過若把from Animal import Animal 這個模組mark掉進行呼叫的話,程式就可以正常執行!)。

OK,現在遇到這樣的狀況,下一步需要思考還有什麼方法可以解決?
在UiPath中找到另一個執行腳本的方法: StartProcess,他是原生的UiPath功能,可以呼叫任何一個腳本(只要給他腳本路徑)。

在原本的python擴充套件,他是同步執行。意思是,它程序會等Python確定執行完並回傳結果之後才會繼續往後面跑,而StartProcess則是可以自己設定要同步還是非同步
非同步就是執行腳本後,UiPath不會等Python結束程序,直接繼續往下執行,這種情況,大家就可以依照自己對需求的情況看需不需要等待回傳結果才能接續後面作業。
但StartProcess也有其限制,它可以設定為同步+timeout(milliseconds),即使它會等python程序結束再往後跑,但它無法讓python結果回傳到UiPath內,只負責呼叫腳本執行!
設定同步非同步需要到Proprties中設定。
如果腳本不需要傳入參數便可以直接呼叫,若需要從UiPath傳入參數給Python,則需要做以下調整跟設定。接續上面的程式碼例子,我想要把name跟age用外部傳入的方式讓程式碼更有彈性:
main.py 我讓name, age可以從外部帶進來,另外使用sys.argv ,即可在呼叫時直接在指令輸入參數,它便會照順序吃到相對應參數 [1]會抓到name, [2]會抓到age。
from Animal import Animal
import sys
name = sys.argv[1]
age = int(sys.argv[2])
def main():
try:
my_animal = Animal(name, age)
rs = my_animal.speak()
print("name:", my_animal.name)
print("age:", my_animal.age)
print(rs)
return rs
except Exception as e:
print(f"An error occurred: {e}")
return f"An error occurred: {e}"
if __name__ == "__main__":
main()
使用方法如下,在呼叫時 後面直接帶入參數,程式碼就會吃到參數內容並建立相對應的物件屬性。

現在了解直接使用指令碼帶入參數的方式之後,我們一樣可以直接在UiPath上設定:
在startProcess中需要輸入
FileName: 腳本路徑 -> Path.Combine("C:\xxx","main.py")
Arguments: 傳入參數 -> String.Format("""{0}"" ""{1}""", animal_name, animal_age)

這樣就會成功透過UiPath傳入參數給Python呼叫Class相關程式碼。
以上為本次分享~
總結一下重點:
- Python擴充套件:UiPath可以帶參數到Python、Python可以將結果回傳UiPath、為同步執行緒、只能呼叫Python function程式碼。
- 原生StartProcess Activity:UiPath可以帶參數給Python、Python不可將結果回傳UiPath、可設定同步或非同步、可呼叫Python Class程式碼。
比較項目 | Python 擴充套件 (Activities) | 原生 Start Process 活動 |
UiPath 帶參數到 Python | 可以 | 可以(透過命令列參數) |
Python 結果回傳 UiPath | 可以(透過 Get Python Object) | 不可直接回傳(需寫入檔案) |
執行緒模式 | 同步執行(於 Python Scope 中執行) | 可設定同步或非同步 |
可呼叫程式碼類型 | 僅限 Function(方法) | 可執行 Class 或整個 Script 檔案 |
技術實現原理 | 調用 Python DLL | 啟動 python.exe |





















