UIPATH調用Python編譯程序exe
好處:
1)code不以可編輯的狀態被用戶接觸,對於不懂反編譯的一般用戶,可提升一定的代碼安全性;
2)不需要用戶機器上安裝 python環境。
3)可以將能夠執行不同任務的腳本編譯成同一個exe程序,通過傳入不同參數實現不同任務。
1).生成並調用單任務 exe程序:
詳見之前的博客:https://blog.csdn.net/qq_24937551/article/details/105517535
- 准備單任務python腳本 2. 將僅執行單任務的腳本打包成exe 3. UIPATH調用exe
2).生成並調用多任務 exe程序:
- 准備多任務python腳本 2. 將可執行多任務的腳本打包成exe 3. UIPATH調用exe
- UIPATH 調用 exe或者python腳本,實際上是使用vb.net來調用cmd命令行來執行exe或腳本,所以難點在於參數的傳遞和解析,尤其是當腳本中的函數需要多種類型的參數,比如位置參數,關鍵字參數等。
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
import sys,getopt # 用來解析參數的兩個庫
class HandleData():
def __init__(self,process_name,log_path='',excel_path='',new_excel_path=''):
self.process_name=process_name
self.log_path=log_path
self.excel_path=excel_path
self.new_excel_path=new_excel_path
def deal_with_data(self):
file_obj=open(self.excel_path)
df=pd.read_csv(file_obj)
# df=pd.read_csv(self.excel_path)
df=df.reindex(columns=['CNUM','COMPANY','C_col','D_col','E_col','F_col','G_col','H_col'],fill_value=None)
df.rename(columns={'COMPANY':'Company_New'}, inplace = True)
df=df.dropna(axis=0,how='all')
df['CNUM'] = df['CNUM'].astype('int32')
df = df.drop_duplicates(subset=['CNUM', 'Company_New'], keep='first')
df.to_csv(self.new_excel_path,index=False,encoding='GBK')
file_obj.close()
def writeLog(self):
with open(self.log_path,"a") as logfile:
logfile.write("\nthat's a test log message")
def writeEventLog(self):
with open(r"C:\Users\12078\Desktop\UIPATH_test\0419\EventLogs_Bot1.txt","a") as logfile:
logfile.write("\nno function found" + self.process_name)
def mainprocess(self):
if self.process_name=="deal_with_data":
HandleData.deal_with_data(self)
elif self.process_name=="writeLog":
HandleData.writeLog(self)
else:
HandleData.writeEventLog(self)
if __name__ == "__main__":
process_name=""
log_path = ""
excel_path = ""
new_excel_path = ""
argv=sys.argv[1:]
try:
opts,args = getopt.getopt(argv,"h",["process_name=","log_path=","excel_path=","new_excel_path="])
except getopt.GetoptError:
print('cnum_company_data0418.py --process_name processname str --log_path logpath str --excel_path datafilepath str --new_excel_path outputfilepath str')
sys.exit(2)
for opt, arg in opts:
if opt == "-h":
print('cnum_company_data0418.py --process_name processname str --log_path logpath str --excel_path datafilepath str --new_excel_path outputfilepath str')
sys.exit()
elif opt == "--process_name":
process_name = arg
elif opt == "--log_path":
log_path = arg
elif opt =="--excel_path":
excel_path = arg
elif opt =="--new_excel_path":
new_excel_path = arg
# print(process_name + "--"+log_path+"--"+excel_path+"--"+new_excel_path+"")
handle=HandleData(process_name,log_path,excel_path,new_excel_path)
handle.mainprocess()
cmd執行python腳本測試效果:
-
測試生成log message的功能:
C:\Users\12078\Desktop\UIPATH_test\0419>python cnum_company_data0419.py --process_name=writeLog --log_path=C:\Users\12078\Desktop\UIPATH_test\0419\mylog.txt
-
測試處理excel/csv數據的功能:
C:\Users\12078\Desktop\UIPATH_test\0419>python cnum_company_data0419.py --process_name=deal_with_data --excel_path=C:\Users\12078\Desktop\UIPATH_test\0419\CNUM_COMPANY.csv --new_excel_path=C:\Users\12078\Desktop\UIPATH_test\0419\out.csv
經過測試,腳本沒有問題
以上程序也可以這樣實現:(知識點:面向對象,反射,元組解包,不定長參數的函數)
# -*- coding: UTF-8 -*-
import pandas as pd
import sys
from pandas import DataFrame,Series
class HandleData():
def deal_with_data(self,paths):
excel_path,new_excel_path=paths
file_obj=open(excel_path)
df=pd.read_csv(file_obj)
df=df.reindex(columns=['CNUM','COMPANY','C_col','D_col','E_col','F_col','G_col','H_col'],fill_value=None)
df.rename(columns={'COMPANY':'Company_New'}, inplace = True)
df=df.dropna(axis=0,how='all')
df['CNUM'] = df['CNUM'].astype('int32')
df = df.drop_duplicates(subset=['CNUM', 'Company_New'], keep='first')
df.to_csv(new_excel_path,index=False,encoding='GBK')
file_obj.close()
def writeLog(self,log_path):
log_path=log_path[0]
with open(log_path,"a") as logfile:
logfile.write("\nthat's a test log message")
def writeEventLog(self,p):
process_name,content=p
with open(r"C:\Users\12078\Desktop\uibot\pytest_mutiply.txt","a") as logfile:
logfile.write("\nno function found" + process_name+"--"+content)
def main(f,*args): # *args表示不定長參數,會將不定長參數打包成元組 args
h=HandleData()
if hasattr(h,f):
getattr(h,f)(args)
if __name__ == "__main__":
# 測試 writeEventLog
# main('writeEventLog','fuc_test','ttesthahah')
# 測試 writeLog
# main('writeLog',r"C:\Users\12078\Desktop\uibot\log_test.txt")
# 測試 deal_with_data
# main('deal_with_data',r"C:\Users\12078\Desktop\uibot\pytest\CNUM_COMPANY.csv",r"C:\Users\12078\Desktop\uibot\pytest\output.csv")
# cmd 執行腳本時:
fuc_name=sys.argv[1]
argvs=sys.argv[2:]
main(fuc_name,*argvs) # *argvs表示解包列表,將列表元素轉為獨立的個體
cmd執行上面的python腳本測試效果:
-
測試生成log message的功能:
C:\Users\12078>python C:\Users\12078\Desktop\uibot\pytest\pydatahandle.py writeEventLog fuc_test testhahah
C:\Users\12078>python C:\Users\12078\Desktop\uibot\pytest\pydatahandle.py writeLog C:\Users\12078\Desktop\uibot\mylog.txt
-
測試處理excel/csv數據的功能:
C:\Users\12078>python C:\Users\12078\Desktop\uibot\pytest\pydatahandle.py deal_with_data C:\Users\12078\Desktop\uibot\pytest\CNUM_COMPANY.csv C:\Users\12078\Desktop\uibot\pytest\out.csv
經過測試,腳本沒有問題
cmd執行exe編譯任務:
cd C:\Users\12078\Desktop\UIPATH_test\0419
C:\Users\12078\Desktop\UIPATH_test\0419>pyinstaller cnum_company_data0419.py
或:
cd C:\Users\12078\Desktop\uibot\pytest
C:\Users\12078\Desktop\uibot\pytest>pyinstaller pydatahandle.py
使用 dist目錄下的 exe程序
UIPATH調用 exe執行多任務:
1.總體框架:
2.第1次調用exe完成第一個任務:
3.第2次調用 exe完成第二個任務:
4.執行結果:
CMD調用 python編譯的exe:
C:\Users\12078>start C:\Users\12078\Desktop\uibot\pytest\dist\pydatahandle\pydatahandle.exe writeEventLog fuc_test testhahah
C:\Users\12078>start C:\Users\12078\Desktop\uibot\pytest\dist\pydatahandle\pydatahandle.exe deal_with_data C:\Users\12078\Desktop\uibot\pytest\CNUM_COMPANY.csv C:\Users\12078\Desktop\uibot\pytest\out.csv
Uibot有啟動應用程序的功能,但沒有傳入參數的設置,可以這樣做:uibot調用 cmd,cmd執行啟動 exe並傳入參數的命令:
說明
1.Author: Collin_PXY ; wechat: pxy123abc