import pdb import json import subprocess import zlib import os import ProcessCommunicator import importlib import traceback import logging import sys import datetime #Создать файл логирования # add filemode="w" to overwrite if not os.path.exists("Reports"): os.makedirs("Reports") logging.basicConfig(filename="Reports\ReportRobotRun_"+datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")+".log", level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") #################################### #Info: Main module of the Robot app (OpenRPA - Robot) #################################### #Usage: #Here you can run some activity or list of activities #After import this module you can use the folowing functions: #ActivityRun(inActivitySpecificationDict): outActivityResultDict - function - run activity (function or procedure) #ActivityRunJSON(inActivitySpecificationDictJSON): outActivityResultDictJSON #ActivityListRun(inActivitySpecificationDictList): outActivityResultDictList - function - run list of activities (function or procedure) #ActivityListRunJSON(inActivitySpecificationDictListJSON): outActivityResultDictListJSON #Naming: #Activity - some action/list of actions #Module - Any *.py file, which consist of area specific functions #Argument #inActivitySpecificationDict: #{ # ModuleName: <"GUI"|..., str>, # ActivityName: , # ArgumentList: [, ...] - optional, # ArgumentDict: {:, ...} - optional #} #outActivityResultDict: #{ # ActivitySpecificationDict: { # ModuleName: <"GUI"|..., str>, # ActivityName: , # ArgumentList: [, ...] - optional, # ArgumentDict: {: , ...} - optional # }, # ErrorFlag: , # ErrorMessage: - required if ErrorFlag is true, # ErrorTraceback: - required if ErrorFlag is true, # Result: - required if ErrorFlag is false #} #################### #Section: Module initialization #################### #Start childprocess - GUI Module 32 bit mProcessGUI_x32 = subprocess.Popen(['..\\Resources\\WPy32-3720\\python-3.7.2\\python.exe','..\\Robot\\GUI.py','release'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #Start childprocess - GUI Module 64 bit - uncomment after WPy64 installation #mProcessGUI_x64 = subprocess.Popen(['..\\Resources\\WPy64-3720\\python-3.7.2\\python.exe','GUI.py'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #################### #Section: Activity #################### def ActivityRun(inActivitySpecificationDict): #Выполнить отправку в модуль GUI, если ModuleName == "GUI" #pdb.set_trace() if inActivitySpecificationDict["ModuleName"] == "GUI": if "ArgumentList" not in inActivitySpecificationDict: inActivitySpecificationDict["ArgumentList"]=[] if "ArgumentDict" not in inActivitySpecificationDict: inActivitySpecificationDict["ArgumentDict"]={} #TODO: Доделать определение разрядности (32 и 64) #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами ProcessCommunicator.ProcessChildSendObject(mProcessGUI_x32,inActivitySpecificationDict) #Получить ответ от дочернего процесса lResponseObject=ProcessCommunicator.ProcessChildReadWaitObject(mProcessGUI_x32) #Вернуть результат #Остальные модули подключать и выполнять здесь else: lArgumentList=[] if "ArgumentList" in inActivitySpecificationDict: lArgumentList=inActivitySpecificationDict["ArgumentList"] lArgumentDict={} if "ArgumentDict" in inActivitySpecificationDict: lArgumentDict=inActivitySpecificationDict["ArgumentDict"] #Подготовить результирующую структуру lResponseObject={"ActivitySpecificationDict":inActivitySpecificationDict,"ErrorFlag":False} try: #Подключить модуль для вызова lModule=importlib.import_module(inActivitySpecificationDict["ModuleName"]) #Найти функцию lFunction=getattr(lModule,inActivitySpecificationDict["FunctionName"]) #Выполнить вызов и записать результат lResponseObject["Result"]=lFunction(*lArgumentList,**lArgumentDict) except Exception as e: #Установить флаг ошибки и передать тело ошибки lResponseObject["ErrorFlag"]=True lResponseObject["ErrorMessage"]=str(e) lResponseObject["ErrorTraceback"]=traceback.format_exc() return lResponseObject ######################################################### #Run list of activities ######################################################### def ActivityListRun(inActivitySpecificationDictList): lResult=[] for lItem in inActivitySpecificationDictList: lResult.append(ActivityRun(lItem)) return lResult