-# Copyright (C) 2013-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2013-2017 CEA/DEN, EDF R&D, OPEN CASCADE
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
if len(configFileNames) == 0:
raise SalomeContextException("No configuration files given")
- reserved=['PATH', 'DYLD_FALLBACK_LIBRARY_PATH', 'DYLD_LIBRARY_PATH', 'LD_LIBRARY_PATH', 'PYTHONPATH', 'MANPATH', 'PV_PLUGIN_PATH', 'INCLUDE', 'LIBPATH', 'SALOME_PLUGINS_PATH']
+ reserved=['PATH', 'DYLD_FALLBACK_LIBRARY_PATH', 'DYLD_LIBRARY_PATH', 'LD_LIBRARY_PATH', 'PYTHONPATH', 'MANPATH', 'PV_PLUGIN_PATH', 'INCLUDE', 'LIBPATH', 'SALOME_PLUGINS_PATH', 'LIBRARY_PATH', 'QT_PLUGIN_PATH']
for filename in configFileNames:
basename, extension = os.path.splitext(filename)
if extension == ".cfg":
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
#
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
#
'car' : '_getCar',
}
- if not command in list(availableCommands.keys()):
+ if command not in availableCommands:
command = "start"
options = args
if command is None:
if args and args[0] in ["-h","--help","help"]:
usage()
- sys.exit(0)
+ return 0
# try to default to "start" command
command = "_runAppli"
try:
res = getattr(self, command)(options) # run appropriate method
- return res or (None, None)
- except SystemExit as returncode:
- if returncode != 0:
- self.getLogger().warning("SystemExit %s in method %s.", returncode, command)
- sys.exit(returncode)
+ return res or 0
+ 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()
- sys.exit(1)
- except SalomeContextException as e:
- self.getLogger().error(e)
- sys.exit(1)
+ return 1
#
def __setContextFromConfigFile(self, filename, reserved=None):
except SalomeContextException as e:
msg = "%s"%e
self.getLogger().error(msg)
- sys.exit(1)
+ return 1
# unset variables
for var in unsetVars:
import runSalome
runSalome.runSalome()
+ return 0
#
def _setContext(self, args=None):
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("***")
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):
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
p = Process(target = killMyPort, args=(port,))
p.start()
p.join()
- pass
+ return 0
#
def _killAll(self, unused=None):
import PortManager # mandatory
from multiprocessing import Process
from killSalomeWithPort import killMyPort
- ports = PortManager.getBusyPorts()
+ ports = PortManager.getBusyPorts()['this']
if ports:
import tempfile
from killSalome import killAllPorts
killAllPorts()
pass
+ return 0
#
def _runTests(self, args=None):
if "-h" in args or "--help" in args:
print(usage + epilog)
- return
+ return 0
if "-p" in args or "--ports" in args:
import PortManager
ports = PortManager.getBusyPorts()
- print("SALOME instances are running on ports:", ports)
- if ports:
- print("Last started instance on port %s"%ports[-1])
+ this_ports = ports['this']
+ other_ports = ports['other']
+ if this_ports or other_ports:
+ print("SALOME instances are running on the following ports:")
+ if this_ports:
+ print(" This application:", this_ports)
+ else:
+ print(" No SALOME instances of this application")
+ if other_ports:
+ print(" Other applications:", other_ports)
+ else:
+ print(" No SALOME instances of other applications")
+ else:
+ print("No SALOME instances are running")
if "-s" in args or "--softwares" in args:
if "-s" in args:
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):
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:
print("")
print(" SALOME is working for you; what else?")
print("")
- sys.exit(0)
#
def _getCar(self, unused=None):
print("")
print(" Drive your simulation properly with SALOME!")
print("")
- sys.exit(0)
#
# Add the following two methods since logger is not pickable
if __name__ == "__main__":
if len(sys.argv) == 3:
- context = sys.argv[1]
- args = sys.argv[2]
-
- context = pickle.loads(context.encode())
- args = pickle.loads(args.encode())
+ context = pickle.loads(sys.argv[1].encode())
+ args = pickle.loads(sys.argv[2].encode())
- (out, err) = context._startSalome(args)
- if out:
- sys.stdout.write(out)
- if err:
- sys.stderr.write(err)
+ status = context._startSalome(args)
+ sys.exit(status)
else:
usage()
#