Salome HOME
Merge changes from 'master' branch.
[modules/kernel.git] / bin / salomeContext.py
index 8a78e1442f586de5bd0e0ed0e15f9dc88043e757..aa8ce10a654fc742b830fca5b18045e52178084f 100644 (file)
@@ -84,7 +84,7 @@ class SalomeContext:
   """
   def __init__(self, configFileNames=0):
     self.getLogger().setLevel(logging.INFO)
-    #it could be None explicitely (if user use multiples setVariable...for standalone)
+    #it could be None explicitly (if user use multiples setVariable...for standalone)
     if configFileNames is None:
        return
     configFileNames = configFileNames or []
@@ -100,14 +100,14 @@ class SalomeContext:
         self.getLogger().error("Unrecognized extension for configuration file: %s", filename)
   #
 
-  def __loadMPI(self, module_name):
-    print("Trying to load MPI module: %s..."%module_name)
+  def __loadEnvModules(self, env_modules):
+    print("Trying to load env modules: %s..." % ' '.join(env_modules))
     try:
-      out, err = subprocess.Popen(["modulecmd", "python", "load", module_name], stdout=subprocess.PIPE).communicate()
+      out, err = subprocess.Popen(["modulecmd", "python", "load"] + env_modules, stdout=subprocess.PIPE).communicate()
       exec(out) # define specific environment variables
-      print(" OK")
+      print("OK")
     except:
-      print(" ** Failed **")
+      print("** Failed **")
       pass
   #
 
@@ -115,22 +115,22 @@ class SalomeContext:
     import os
     # Run this module as a script, in order to use appropriate Python interpreter
     # according to current path (initialized from context files).
-    mpi_module_option = "--with-mpi-module="
-    mpi_module = [x for x in args if x.startswith(mpi_module_option)]
-    if mpi_module:
-      mpi_module = mpi_module[0][len(mpi_module_option):]
-      self.__loadMPI(mpi_module)
-      args = [x for x in args if not x.startswith(mpi_module_option)]
+    env_modules_option = "--with-env-modules="
+    env_modules_l = [x for x in args if x.startswith(env_modules_option)]
+    if env_modules_l:
+      env_modules = env_modules_l[-1][len(env_modules_option):].split(',')
+      self.__loadEnvModules(env_modules)
+      args = [x for x in args if not x.startswith(env_modules_option)]
     else:
-      mpi_module = os.getenv("SALOME_MPI_MODULE_NAME", None)
-      if mpi_module:
-        self.__loadMPI(mpi_module)
+      env_modules = os.getenv("SALOME_ENV_MODULES", None)
+      if env_modules:
+        self.__loadEnvModules(env_modules.split(','))
 
     absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','')
     env_copy = os.environ.copy()
-    selfBytes= pickle.dumps(self,protocol=0)
-    argsBytes= pickle.dumps(args,protocol=0)
-    proc = subprocess.Popen(['python', os.path.join(absoluteAppliPath,"bin","salome","salomeContext.py"), selfBytes.decode(), argsBytes.decode()], shell=False, close_fds=True, env=env_copy)
+    selfBytes= pickle.dumps(self, protocol=0)
+    argsBytes= pickle.dumps(args, protocol=0)
+    proc = subprocess.Popen(['python3', os.path.join(absoluteAppliPath,"bin","salome","salomeContext.py"), selfBytes.decode(), argsBytes.decode()], shell=False, close_fds=True, env=env_copy)
     out, err = proc.communicate()
     return out, err, proc.returncode
   #
@@ -233,7 +233,7 @@ class SalomeContext:
 
   """
   Run SALOME!
-  Args consist in a mandatory command followed by optionnal parameters.
+  Args consist in a mandatory command followed by optional parameters.
   See usage for details on commands.
   """
   def _startSalome(self, args):
@@ -263,18 +263,18 @@ class SalomeContext:
     try:
       res = getattr(self, command)(options) # run appropriate method
       return res or 0
-    except SystemExit as returncode:
-      if returncode != 0:
-        self.getLogger().error("SystemExit %s in method %s.", returncode, command)
-      return returncode
+    except SystemExit as ex:
+      if ex.code != 0:
+        self.getLogger().error("SystemExit %s in method %s.", ex.code, command)
+      return ex.code
+    except SalomeContextException as e:
+      self.getLogger().error(e)
+      return 1
     except Exception:
       self.getLogger().error("Unexpected error:")
       import traceback
       traceback.print_exc()
       return 1
-    except SalomeContextException as e:
-      self.getLogger().error(e)
-      return 1
   #
 
   def __setContextFromConfigFile(self, filename, reserved=None):
@@ -321,6 +321,7 @@ class SalomeContext:
 
     import runSalome
     runSalome.runSalome()
+    return 0
   #
 
   def _setContext(self, args=None):
@@ -330,7 +331,7 @@ class SalomeContext:
       print("*** SALOME context has already been set.")
       print("*** Enter 'exit' (only once!) to leave SALOME context.")
       print("***")
-      return
+      return 0
 
     os.environ["SALOME_CONTEXT_SET"] = "yes"
     print("***")
@@ -340,7 +341,8 @@ class SalomeContext:
 
     cmd = ["/bin/bash"]
     proc = subprocess.Popen(cmd, shell=False, close_fds=True)
-    return proc.communicate()
+    proc.communicate()
+    return proc.returncode
   #
 
   def _runSession(self, args=None):
@@ -375,7 +377,7 @@ class SalomeContext:
     ports = args
     if not ports:
       print("Port number(s) not provided to command: salome kill <port(s)>")
-      return
+      return 1
 
     from multiprocessing import Process
     from killSalomeWithPort import killMyPort
@@ -385,7 +387,7 @@ class SalomeContext:
         p = Process(target = killMyPort, args=(port,))
         p.start()
         p.join()
-    pass
+    return 0
   #
 
   def _killAll(self, unused=None):
@@ -407,6 +409,7 @@ class SalomeContext:
       from killSalome import killAllPorts
       killAllPorts()
       pass
+    return 0
   #
 
   def _runTests(self, args=None):
@@ -468,7 +471,7 @@ Available options are:
 
     if "-h" in args or "--help" in args:
       print(usage + epilog)
-      return
+      return 0
 
     if "-p" in args or "--ports" in args:
       import PortManager
@@ -500,7 +503,9 @@ Available options are:
 
     if "-v" in args or "--version" in args:
       print("Running with python", platform.python_version())
-      self._runAppli(["--version"])
+      return self._runAppli(["--version"])
+
+    return 0
   #
 
   def _showDoc(self, args=None):
@@ -510,7 +515,7 @@ Available options are:
     modules = args
     if not modules:
       print("Module(s) not provided to command: salome doc <module(s)>")
-      return
+      return 1
 
     appliPath = os.getenv("ABSOLUTE_APPLI_PATH")
     if not appliPath: