]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
[EDF27816] : WIP
authorAnthony Geay <anthony.geay@edf.fr>
Mon, 21 Aug 2023 06:22:08 +0000 (08:22 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Mon, 21 Aug 2023 06:22:08 +0000 (08:22 +0200)
idl/SALOME_Component.idl
idl/SALOME_PyNode.idl
src/Container/Container_i.cxx
src/Container/SALOME_ContainerManager.cxx
src/Container/SALOME_Container_i.hxx
src/Container/SALOME_PyNode.py

index dfbfc0070855c04d02d93d8dee9583a1d4b36356..6448b98ff236d5fc78fdd2eebd35eec0691dd34f 100644 (file)
@@ -80,6 +80,8 @@ module Engines
 
     void override_environment( in FieldsDict env );
 
+    void override_environment_python( in FieldsDict env );
+
     FieldsDict get_os_environment();
 
     /*! \brief Loads a new component class (dynamic library).
index 7aaec47753bd5d2dfd9243daeeb9d14bf62d6476..20d92ba96cb80695611b50c2a921609e60d41c91 100644 (file)
@@ -90,6 +90,8 @@ module Engines
     */
     pickledArgs execute(in listofstring outargsname, in pickledArgs inargs) raises (SALOME::SALOME_Exception);
 
+    void executeSimple(in listofstring key, in listofstring val) raises (SALOME::SALOME_Exception);
+
     /*! \brief first part of whole execute method. This split is to reduce the memory peak.
     */
     void executeFirst(in SALOME::SenderByte inargs) raises (SALOME::SALOME_Exception);
index cb732a8ce49629991f6be228554c6eccfaa0dd33..939af3b4a94af1d7b79da44ad0142a9ed299973f 100644 (file)
@@ -1017,7 +1017,7 @@ void EffectiveOverrideEnvironment( const Engines::FieldsDict& env )
   {
     if (env[i].value.type()->kind() == CORBA::tk_string)
     {
-      const char* value;
+      const char *value = nullptr;
       env[i].value >>= value;
       MESSAGE( env[i].key << " = " << value);
 #ifndef WIN32
@@ -1053,6 +1053,28 @@ void Abstract_Engines_Container_i::override_environment( const Engines::FieldsDi
   EffectiveOverrideEnvironment(env);
 }
 
+void Abstract_Engines_Container_i::override_environment_python( const Engines::FieldsDict& env )
+{
+  constexpr char NODE_NAME[] = "ScriptNodeForEnv";
+  constexpr char SCRIPT[] = R"foo(
+import os
+for k,v in env:
+  os.environ[k] = v
+)foo";
+  Engines::PyScriptNode_var scriptNode = this->createPyScriptNode(NODE_NAME,SCRIPT);
+  auto sz = env.length();
+  Engines::listofstring keys( sz ), vals( sz );
+  for( auto i = 0 ; i < sz ; ++i )
+  {
+    keys[i] = CORBA::string_dup( env[i].key );
+    const char *value = nullptr;
+    env[i].value >>= value;
+    vals[i] = CORBA::string_dup( value );
+  }
+  scriptNode->executeSimple(keys,vals);
+  this->removePyScriptNode(NODE_NAME);
+}
+
 Engines::FieldsDict *Abstract_Engines_Container_i::get_os_environment()
 {
   std::unique_ptr<Engines::FieldsDict> ret( new Engines::FieldsDict );
index 1660fe156b84d362f0c6228a438c97ac0ed724c6..fa821b1a955b5097b68c05c18bbfeccc51123fac 100644 (file)
@@ -473,7 +473,7 @@ Engines::Container_ptr SALOME_ContainerManager::GiveContainer(const Engines::Con
             envCorba[i].value <<= CORBA::string_dup( _override_env[i].second.c_str() );
           }
         }
-        cont->override_environment( envCorba );
+        cont->override_environment_python( envCorba );
         return cont._retn();
       }
       else
index 04ff07d9c5ff05c3dee59765301027c77b50d967..9ca1d8b6b6a5d481cdd33d344de06f3c5d1fa0b9 100644 (file)
@@ -72,6 +72,8 @@ public:
   virtual Engines::EngineComponent_ptr
   create_component_instance(const char *componentName);
 
+  void override_environment_python( const Engines::FieldsDict& env ) override;
+
   void override_environment( const Engines::FieldsDict& env ) override;
 
   Engines::FieldsDict *get_os_environment() override;
index 071cdbe8ba5f3db51ad43f0452dac6e0643a527c..568c07e7c6f4a4912813cef13c985acabf7b761d 100644 (file)
@@ -416,6 +416,18 @@ class PyScriptNode_i (Engines__POA.PyScriptNode,Generic):
     except Exception:
       raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"","PyScriptNode.assignNewCompiledCode (%s) : code to be executed \"%s\"" %(self.nodeName,codeStr),0))
 
+  def executeSimple(self, key, val):
+    """
+    Same as execute method except that no pickelization mecanism is implied here. No output is expected
+    """
+    try:
+      self.context.update({ "env" : [(k,v) for k,v in zip(key,val)]})
+      exec(self.ccode,self.context)
+    except Exception:
+      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: %s" % (self.nodeName),0))
+    
   def execute(self,outargsname,argsin):
     """Execute the script stored in attribute ccode with pickled args (argsin)"""
     try: