|
|
|
from pyOpenRPA.Tools import CrossOS
|
|
|
|
if CrossOS.IS_WINDOWS_BOOL: import pywinauto #Is needed to detect OS bitness
|
|
|
|
|
|
|
|
import struct # Need to detect Current process bitness
|
|
|
|
import subprocess #Need to create subprocess
|
|
|
|
import os # Is needed to check file/folder path
|
|
|
|
import shutil #os operations
|
|
|
|
import pdb
|
|
|
|
############################################
|
|
|
|
####Module, which control the Bitness between 32 and 64 python (needed for pywinauto framework to work correctly)
|
|
|
|
############################################
|
|
|
|
global mSettingsDict
|
|
|
|
mSettingsDict = {
|
|
|
|
"BitnessProcessCurrent": "64", # "64" or "32"
|
|
|
|
"BitnessOS": "64", # "64" or "32"
|
|
|
|
"Python32FullPath": None, #Set from user: "..\\Resources\\WPy32-3720\\python-3.7.2\\OpenRPARobotGUIx32.exe"
|
|
|
|
"Python64FullPath": None, #Set from user
|
|
|
|
"Python32ProcessName": "OpenRPAUIDesktopX32.exe", #Config set once
|
|
|
|
"Python64ProcessName": "OpenRPAUIDesktopX64.exe", #Config set once
|
|
|
|
"Python32Process":None,
|
|
|
|
"Python64Process":None,
|
|
|
|
"PythonArgs":["-m","pyOpenRPA.Robot"] #Start other bitness openRPA process with PIPE channel
|
|
|
|
}
|
|
|
|
#Init the global configuration
|
|
|
|
def SettingsInit(inSettingsDict):
|
|
|
|
if inSettingsDict:
|
|
|
|
global mSettingsDict
|
|
|
|
#Update values in settings from input
|
|
|
|
mSettingsDict.update(inSettingsDict)
|
|
|
|
#mSettingsDict = inSettingsDict
|
|
|
|
####################
|
|
|
|
#Detect OS bitness
|
|
|
|
####BitnessOS#######
|
|
|
|
lBitnessOS="32";
|
|
|
|
if pywinauto.sysinfo.is_x64_OS():
|
|
|
|
lBitnessOS="64";
|
|
|
|
inSettingsDict["BitnessOS"]=lBitnessOS
|
|
|
|
####################
|
|
|
|
#Detect current process bitness
|
|
|
|
####BitnessProcessCurrent#######
|
|
|
|
lBitnessProcessCurrent = str(struct.calcsize("P") * 8)
|
|
|
|
inSettingsDict["BitnessProcessCurrent"]=lBitnessProcessCurrent
|
|
|
|
#####################################
|
|
|
|
#Create the other bitness process if OS is 64 and we have another Python path
|
|
|
|
##########################################################################
|
|
|
|
#Check if OS is x64, else no 64 is applicable
|
|
|
|
if mSettingsDict["BitnessOS"]=="64":
|
|
|
|
#Check if current bitness is 64
|
|
|
|
if mSettingsDict["BitnessProcessCurrent"]=="64":
|
|
|
|
#create x32 if Python 32 path is exists
|
|
|
|
if mSettingsDict["Python32FullPath"] and mSettingsDict["Python32ProcessName"]:
|
|
|
|
#Calculate python.exe folder path
|
|
|
|
lPython32FolderPath= "\\".join(mSettingsDict["Python32FullPath"].split("\\")[:-1])
|
|
|
|
lPython32NewNamePath = f"{lPython32FolderPath}\\{mSettingsDict['Python32ProcessName']}"
|
|
|
|
if not os.path.isfile(lPython32NewNamePath):
|
|
|
|
shutil.copyfile(mSettingsDict["Python32FullPath"],lPython32NewNamePath)
|
|
|
|
#pdb.set_trace()
|
|
|
|
mSettingsDict["Python32Process"] = subprocess.Popen([lPython32NewNamePath] + mSettingsDict["PythonArgs"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
|
|
|
else:
|
|
|
|
#bitness current process is 32
|
|
|
|
#return x64 if it is exists
|
|
|
|
if mSettingsDict["Python64Process"]:
|
|
|
|
#Calculate python.exe folder path
|
|
|
|
lPython64FolderPath= "\\".join(mSettingsDict["Python64FullPath"].split("\\")[:-1])
|
|
|
|
lPython64NewNamePath = f"{lPython64FolderPath}\\{mSettingsDict['Python64ProcessName']}"
|
|
|
|
if not os.path.isfile(lPython64NewNamePath):
|
|
|
|
shutil.copyfile(mSettingsDict["Python64FullPath"],lPython64NewNamePath)
|
|
|
|
mSettingsDict["Python64Process"] = subprocess.Popen([lPython64NewNamePath] + mSettingsDict["PythonArgs"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
|
|
|
#Return the other module bitnes
|
|
|
|
def OtherProcessGet():
|
|
|
|
#Result template
|
|
|
|
lResult = None
|
|
|
|
global mSettingsDict
|
|
|
|
#Check if OS is x64, else no 64 is applicable
|
|
|
|
if mSettingsDict["BitnessOS"]=="64":
|
|
|
|
#Check if current bitness is 64
|
|
|
|
if mSettingsDict["BitnessProcessCurrent"]=="64":
|
|
|
|
#return x32 if it is exists
|
|
|
|
if mSettingsDict["Python32Process"]:
|
|
|
|
lResult = mSettingsDict["Python32Process"]
|
|
|
|
else:
|
|
|
|
#bitness current process is 32
|
|
|
|
#return x64 if it is exists
|
|
|
|
if mSettingsDict["Python64Process"]:
|
|
|
|
lResult = mSettingsDict["Python64Process"]
|
|
|
|
#Exit
|
|
|
|
return lResult
|