Salome HOME
[EDF30356] : Extend management of maximum_time attribute format from pylauncher to...
[modules/kernel.git] / bin / salomeContext.py
index 8493e6f8b013f4b11f5fde6500c2b4e91b31fbd7..04f960e31b69b98e77b3a6febf68a954989a8584 100755 (executable)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python3
-# Copyright (C) 2013-2021  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2013-2024  CEA, EDF, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -33,9 +33,10 @@ import platform
 
 from salomeContextUtils import SalomeContextException
 
-def usage():
+def usage(appended_cmd_doc = "", appended_opt_doc = ""):
+  add_in_help = {"appended_cmd_doc":appended_cmd_doc,"appended_opt_doc":appended_opt_doc}
   msg = '''\
-Usage: salome [command] [options] [--config=<file,folder,...>]
+Usage: salome [command] [options] [--config=<file,folder,...>] [--with-env-modules=<env_module1,env_module2,...>]
 
 Commands:
 =========
@@ -58,7 +59,7 @@ Commands:
                     Port numbers must be separated by blank characters.
     killall         Terminate *all* SALOME running SWS instances for current user.
                     Do not start a new one.
-
+%(appended_cmd_doc)s
 If no command is given, default is start.
 
 Command options:
@@ -71,9 +72,15 @@ Command options:
     Initialize SALOME context from a list of context files and/or a list
     of folders containing context files. The list is comma-separated, without
     any blank characters.
+
+--with-env-modules=<env_module1,env_module2,...>
+================================================
+    Initialize SALOME context with the provided additional environment modules.
+    The list is comma-separated, without any blank characters.
+%(appended_opt_doc)s
 '''
 
-  print(msg)
+  print(msg%add_in_help)
 #
 
 """
@@ -111,7 +118,7 @@ class SalomeContext:
       raise SalomeContextException("Module environment not present")
       return
     try:
-      out, err = subprocess.Popen([modulecmd, "python", "load"] + env_modules, stdout=subprocess.PIPE).communicate()
+      out, err = subprocess.Popen([modulecmd, "python", "try-load"] + env_modules, stdout=subprocess.PIPE).communicate()
       exec(out)  # define specific environment variables
     except Exception:
       raise SalomeContextException("Failed to load env modules: %s ..." % ' '.join(env_modules))
@@ -195,11 +202,11 @@ class SalomeContext:
 
   """Unset environment variable"""
   def unsetVariable(self, name):
-    if os.environ.has_key(name):
+    if name in os.environ:
       del os.environ[name]
   #
 
-  """Append value to environment variable"""
+  """Prepend value to environment variable"""
   def addToVariable(self, name, value, separator=os.pathsep):
     if value == '':
       return
@@ -213,6 +220,43 @@ class SalomeContext:
       os.environ[name] = value + separator + env
   #
 
+  """Append a variable"""
+  def appendVariable(self, name, value, separator=os.pathsep):
+    if value == '':
+      return
+
+    value = os.path.expandvars(value) # expand environment variables
+    env = os.getenv(name, None)
+    if env is None:
+      os.environ[name] = value
+    else:
+      os.environ[name] = env + separator + value
+    return
+
+  """Remove value from environment variable"""
+  def removeFromVariable(self, name, value, separator=os.pathsep):
+    if value == '':
+      return
+
+    value = os.path.expandvars(value) # expand environment variables
+    self.getLogger().debug("Remove from %s: %s", name, value)
+    env = os.getenv(name, None)
+    if env == value:
+      env = ''
+    else:
+      # env = env.removeprefix(value + separator) (Python >= 3.9)
+      str = value + separator
+      if env.startswith(str):
+        env = env[len(str):]
+      # env = env.removesuffix(separator + value) (Python >= 3.9)
+      str = separator + value
+      if env.endswith(str):
+        env = env[:-len(str)]
+      env = env.replace(separator + value + separator, ':')
+
+    os.environ[name] = env
+  #
+
   ###################################
   # This begins the private section #
   ###################################
@@ -365,8 +409,12 @@ class SalomeContext:
     if args is None:
       args = []
     sys.argv = ['runSalome'] + args
-    import runSalomeNoServer
-    runSalomeNoServer.main()
+    import setenv
+    setenv.main(True, exeName="salome withsession")
+
+    import runSalome
+    runSalome.runSalome()
+    return 0
   #
 
   def _setContext(self, args=None):
@@ -410,7 +458,7 @@ class SalomeContext:
   def _runRemote(self, args=None):
     if args is None:
       args = []
-#   complete salome environment 
+#   complete salome environment
     sys.argv = ['runRemote']
     import setenv
     setenv.main(True)