From 2cc09c6b5c47451083395efcf994e26cdc6d4240 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Mon, 6 Apr 2020 15:24:34 +0200 Subject: [PATCH] Additionnal remote callable methods for debugging and for remote python invocation by reducing memory peak. --- idl/SALOME_PyNode.idl | 16 +++++++++++- src/Container/SALOME_PyNode.py | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/idl/SALOME_PyNode.idl b/idl/SALOME_PyNode.idl index 6c8af4241..efdb6d855 100644 --- a/idl/SALOME_PyNode.idl +++ b/idl/SALOME_PyNode.idl @@ -37,9 +37,16 @@ module Engines { typedef sequence pickledArgs; typedef sequence listofstring; + interface Container; interface PyNodeBase : SALOME::GenericObj { + Container getContainer(); + + string getCode(); + + string getName(); + /*! This method allows to define a new global var called \a varName. This newly created var will be set to value \a valueOfVar. @@ -82,7 +89,14 @@ module Engines */ pickledArgs execute(in listofstring outargsname, in pickledArgs inargs) raises (SALOME::SALOME_Exception); - + /*! \brief first part of whole execute method. This split is to reduce the memory peak. + */ + void executeFirst(in pickledArgs inargs) raises (SALOME::SALOME_Exception); + + /*! \brief second and last part of execute method. This split is to reduce the memory peak. + */ + pickledArgs executeSecond(in listofstring outargsname) raises (SALOME::SALOME_Exception); + pickledArgs getValueOfVarInContext(in string varName) raises (SALOME::SALOME_Exception); void assignVarInContext(in string varName, in pickledArgs value) raises (SALOME::SALOME_Exception); diff --git a/src/Container/SALOME_PyNode.py b/src/Container/SALOME_PyNode.py index 48a839e8c..dee1f1896 100644 --- a/src/Container/SALOME_PyNode.py +++ b/src/Container/SALOME_PyNode.py @@ -68,6 +68,15 @@ class PyNode_i (Engines__POA.PyNode,Generic): self.context["my_container"] = self.my_container exec(ccode, self.context) + def getContainer(self): + return self.my_container + + def getCode(self): + return self.code + + def getName(self): + return self.nodeName + def defineNewCustomVar(self,varName,valueOfVar): self.context[varName] = pickle.loads(valueOfVar) pass @@ -106,6 +115,15 @@ class PyScriptNode_i (Engines__POA.PyScriptNode,Generic): self.context={} self.context["my_container"] = self.my_container + def getContainer(self): + return self.my_container + + def getCode(self): + return self.code + + def getName(self): + return self.nodeName + def defineNewCustomVar(self,varName,valueOfVar): self.context[varName] = pickle.loads(valueOfVar) pass @@ -143,6 +161,33 @@ class PyScriptNode_i (Engines__POA.PyScriptNode,Generic): l=traceback.format_exception(exc_typ,exc_val,exc_fr) raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode: %s, outargsname: %s" % (self.nodeName,outargsname),0)) + def executeFirst(self,argsin): + """ Same than first part of self.execute to reduce memory peak.""" + import time + try: + _,kws=pickle.loads(argsin) + self.context.update(kws) + except: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode:First %s" % (self.nodeName),0)) + + def executeSecond(self,outargsname): + """ Same than second part of self.execute to reduce memory peak.""" + try: + exec(self.ccode, self.context) + argsout=[] + for arg in outargsname: + if arg not in self.context: + raise KeyError("There is no variable %s in context" % arg) + argsout.append(self.context[arg]) + argsout=pickle.dumps(tuple(argsout),-1) + return argsout + except: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode:Second %s, outargsname: %s" % (self.nodeName,outargsname),0)) + def getValueOfVarInContext(self,varName): try: return pickle.dumps(self.context[varName],-1) -- 2.39.2