-# Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2013-2015 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
import platform
from salomeContextUtils import SalomeContextException
-from salomeContextUtils import getScriptsAndArgs, formatScriptsAndArgs
def usage():
#exeName = os.path.splitext(os.path.basename(__file__))[0]
msg = '''\
-Usage: salome [command] [options] [--config=file1,...,filen]
+Usage: salome [command] [options] [--config=<file,folder,...>]
Commands:
- start Launches SALOME virtual application [DEFAULT]
- shell Executes a script under SALOME application environment
- connect Connects a Python console to the active SALOME session
- killall Kill all SALOME running sessions
- info Display some information about SALOME
- help Show this message
- coffee Yes! SALOME can also make coffee!!"
-
-Use salome start --help or salome shell --help
-to show help on start and shell commands.
+=========
+ start Starts a SALOME session (through virtual application)
+ context Initializes SALOME context.
+ shell Initializes SALOME context, and executes scripts passed
+ as command arguments
+ connect Connects a Python console to the active SALOME session
+ kill <port(s)> Terminate SALOME session running on given ports for current user
+ Port numbers must be separated by blank characters
+ killall Kill *all* SALOME running sessions for current user
+ test Run SALOME tests.
+ info Display some information about SALOME
+ help Show this message
+ coffee Yes! SALOME can also make coffee!!
+
+If no command is given, default to start.
+
+Command options:
+================
+ Use salome <command> --help to show help on command ; available for commands:
+ start, shell, test.
+
+--config=<file,folder,...>
+==========================
+ Initialize SALOME context from a list of context files and/or a list
+ of folders containing context files. The list is comma-separated, whithout
+ any blank characters.
'''
print msg
#
"""
-The SalomeContext class in an API to configure SALOME environment then
+The SalomeContext class in an API to configure SALOME context then
start SALOME using a single python command.
"""
class SalomeContext:
"""
- Initialize environment from a list of configuration files
+ Initialize context from a list of configuration files
identified by their names.
These files should be in appropriate (new .cfg) format.
However you can give old .sh environment files; in this case,
the SalomeContext class will try to automatically convert them
- to .cfg format before setting the environment.
+ to .cfg format before setting the context.
"""
- def __init__(self, configFileNames=[]):
+ def __init__(self, configFileNames=0):
#it could be None explicitely (if user use multiples setVariable...for standalone)
- if configFileNames==None:
+ if configFileNames is None:
return
-
+ configFileNames = configFileNames or []
if len(configFileNames) == 0:
raise SalomeContextException("No configuration files given")
- reserved=['PATH', 'DYLD_LIBRARY_PATH', 'LD_LIBRARY_PATH', 'PYTHONPATH', 'MANPATH', 'PV_PLUGIN_PATH']
+ reserved=['PATH', 'DYLD_LIBRARY_PATH', 'LD_LIBRARY_PATH', 'PYTHONPATH', 'MANPATH', 'PV_PLUGIN_PATH', 'INCLUDE', 'LIBPATH', 'SALOME_PLUGINS_PATH']
for filename in configFileNames:
basename, extension = os.path.splitext(filename)
if extension == ".cfg":
- self.__setEnvironmentFromConfigFile(filename, reserved)
+ self.__setContextFromConfigFile(filename, reserved)
elif extension == ".sh":
#new convert procedures, temporary could be use not to be automatically deleted
#temp = tempfile.NamedTemporaryFile(suffix='.cfg', delete=False)
temp = tempfile.NamedTemporaryFile(suffix='.cfg')
try:
convertEnvFileToConfigFile(filename, temp.name, reserved)
- self.__setEnvironmentFromConfigFile(temp.name, reserved)
+ self.__setContextFromConfigFile(temp.name, reserved)
temp.close()
except (ConfigParser.ParsingError, ValueError) as e:
self.getLogger().error("Invalid token found when parsing file: %s\n"%(filename))
self.getLogger().warning("Unrecognized extension for configuration file: %s", filename)
#
+ def __loadMPI(self, module_name):
+ print "Trying to load MPI module: %s..."%module_name,
+ try:
+ out, err = subprocess.Popen(["modulecmd", "python", "load", module_name], stdout=subprocess.PIPE).communicate()
+ exec out # define specific environment variables
+ print " OK"
+ except:
+ print " ** Failed **"
+ pass
+ #
+
def runSalome(self, args):
+ import os
# Run this module as a script, in order to use appropriate Python interpreter
- # according to current path (initialized from environment files).
- kill = False
- for e in args:
- if "--shutdown-server" in e:
- kill = True
- args.remove(e)
+ # 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)]
+ else:
+ mpi_module = os.getenv("SALOME_MPI_MODULE_NAME", None)
+ if mpi_module:
+ self.__loadMPI(mpi_module)
absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','')
- proc = subprocess.Popen(['python', os.path.join(absoluteAppliPath,"bin","salome","salomeContext.py"), pickle.dumps(self), pickle.dumps(args)], shell=False, close_fds=True)
+ env_copy = os.environ.copy()
+ proc = subprocess.Popen(['python', os.path.join(absoluteAppliPath,"bin","salome","salomeContext.py"), pickle.dumps(self), pickle.dumps(args)], shell=False, close_fds=True, env=env_copy)
msg = proc.communicate()
- if kill:
- self._killAll(args)
- return msg
+ return msg, proc.returncode
#
"""Append value to PATH environment variable"""
options = args[1:]
availableCommands = {
- 'start' : '_runAppli',
- 'shell' : '_runSession',
+ 'start' : '_runAppli',
+ 'context' : '_setContext',
+ 'shell' : '_runSession',
'connect' : '_runConsole',
- 'killall': '_killAll',
- 'info': '_showInfo',
- 'help': '_usage',
- 'coffee' : '_makeCoffee'
+ 'kill' : '_kill',
+ 'killall' : '_killAll',
+ 'test' : '_runTests',
+ 'info' : '_showInfo',
+ 'help' : '_usage',
+ 'coffee' : '_makeCoffee',
+ 'car' : '_getCar',
}
if not command in availableCommands.keys():
See usage for details on commands.
"""
def _startSalome(self, args):
+ import os
+ import sys
+ try:
+ from setenv import add_path
+ absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH')
+ path = os.path.realpath(os.path.join(absoluteAppliPath, "bin", "salome"))
+ add_path(path, "PYTHONPATH")
+ path = os.path.realpath(os.path.join(absoluteAppliPath, "bin", "salome", "appliskel"))
+ add_path(path, "PYTHONPATH")
+
+ except:
+ pass
+
command, options = self.__parseArguments(args)
sys.argv = options
try:
res = getattr(self, command)(options) # run appropriate method
return res or (None, None)
- except SystemExit, exc:
- if exc==0:
- sys.exit(0) #catch sys.exit(0) happy end no warning
- if exc==1:
- self.getLogger().warning("SystemExit 1 in method %s.", command)
- sys.exit(1)
+ except SystemExit, returncode:
+ if returncode != 0:
+ self.getLogger().warning("SystemExit %s in method %s.", returncode, command)
+ sys.exit(returncode)
except StandardError:
self.getLogger().error("Unexpected error:")
import traceback
sys.exit(1)
#
- def __setEnvironmentFromConfigFile(self, filename, reserved=[]):
+ def __setContextFromConfigFile(self, filename, reserved=None):
+ if reserved is None:
+ reserved = []
try:
unsetVars, configVars, reservedDict = parseConfigFile(filename, reserved)
except SalomeContextException, e:
temp = tempfile.NamedTemporaryFile(suffix='.cfg')
try:
convertEnvFileToConfigFile(sh_file, temp.name, reserved)
- self.__setEnvironmentFromConfigFile(temp.name, reserved)
+ self.__setContextFromConfigFile(temp.name, reserved)
msg += "OK\n"
self.getLogger().warning(msg)
temp.close()
for var in unsetVars:
self.unsetVariable(var)
- # set environment
+ # set context
for reserved in reservedDict:
a = filter(None, reservedDict[reserved]) # remove empty elements
- reformattedVals = ':'.join(a)
- self.addToVariable(reserved, reformattedVals)
+ a = [ os.path.realpath(x) for x in a ]
+ reformattedVals = os.pathsep.join(a)
+ if reserved in ["INCLUDE", "LIBPATH"]:
+ self.addToVariable(reserved, reformattedVals, separator=' ')
+ else:
+ self.addToVariable(reserved, reformattedVals)
pass
for key,val in configVars:
self.setVariable(key, val, overwrite=True)
pass
- sys.path[:0] = os.getenv('PYTHONPATH','').split(':')
+ pythonpath = os.getenv('PYTHONPATH','').split(os.pathsep)
+ pythonpath = [ os.path.realpath(x) for x in pythonpath ]
+ sys.path[:0] = pythonpath
#
- def _runAppli(self, args=[]):
+ def _runAppli(self, args=None):
+ if args is None:
+ args = []
# Initialize SALOME environment
sys.argv = ['runSalome'] + args
import setenv
runSalome.runSalome()
#
- def _runSession(self, args=[]):
+ def _setContext(self, args=None):
+ salome_context_set = os.getenv("SALOME_CONTEXT_SET")
+ if salome_context_set:
+ print "***"
+ print "*** SALOME context has already been set."
+ print "*** Enter 'exit' (only once!) to leave SALOME context."
+ print "***"
+ return
+
+ os.environ["SALOME_CONTEXT_SET"] = "yes"
+ print "***"
+ print "*** SALOME context is now set."
+ print "*** Enter 'exit' (only once!) to leave SALOME context."
+ print "***"
+
+ cmd = ["/bin/bash"]
+ proc = subprocess.Popen(cmd, shell=False, close_fds=True)
+ return proc.communicate()
+ #
+
+ def _runSession(self, args=None):
+ if args is None:
+ args = []
sys.argv = ['runSession'] + args
import runSession
- runSession.configureSession(args)
+ params, args = runSession.configureSession(args, exe="salome shell")
+ sys.argv = ['runSession'] + args
import setenv
setenv.main(True)
- scriptArgs = getScriptsAndArgs(args)
- command = formatScriptsAndArgs(scriptArgs)
- if command:
- sep = ";"
- if sys.platform == "win32":
- sep= "&"
- command = command.split(sep)
- outmsg = []
- errmsg = []
- for cmd in command:
- cmd = cmd.strip().split(' ')
- #proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- proc = subprocess.Popen(cmd)
- (stdoutdata, stderrdata) = proc.communicate()
- if stdoutdata or stderrdata:
- outmsg.append(stdoutdata)
- errmsg.append(stderrdata)
-
- return ("".join(outmsg), "".join(errmsg))
- else:
- absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','')
- cmd = ["/bin/bash", "--rcfile", absoluteAppliPath + "/.bashrc" ]
- proc = subprocess.Popen(cmd, shell=False, close_fds=True)
- return proc.communicate()
+ return runSession.runSession(params, args)
#
- def _runConsole(self, args=[]):
+ def _runConsole(self, args=None):
+ if args is None:
+ args = []
# Initialize SALOME environment
sys.argv = ['runConsole'] + args
import setenv
return proc.communicate()
#
- def _killAll(self, args=[]):
- absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','')
+ def _kill(self, args=None):
+ if args is None:
+ args = []
+ ports = args
+ if not ports:
+ print "Port number(s) not provided to command: salome kill <port(s)>"
+ return
+
+ from multiprocessing import Process
+ from killSalomeWithPort import killMyPort
+ import tempfile
+ for port in ports:
+ with tempfile.NamedTemporaryFile():
+ p = Process(target = killMyPort, args=(port,))
+ p.start()
+ p.join()
+ pass
+ #
+
+ def _killAll(self, unused=None):
try:
import PortManager # mandatory
from multiprocessing import Process
from killSalome import killAllPorts
killAllPorts()
pass
+ #
+ def _runTests(self, args=None):
+ if args is None:
+ args = []
+ sys.argv = ['runTests']
+ import setenv
+ setenv.main(True)
+
+ import runTests
+ return runTests.runTests(args, exe="salome test")
#
- def _showInfo(self, args=[]):
+ def _showInfo(self, unused=None):
print "Running with python", platform.python_version()
self._runAppli(["--version"])
#
- def _usage(self, unused=[]):
+ def _usage(self, unused=None):
usage()
#
- def _makeCoffee(self, args=[]):
+ def _makeCoffee(self, unused=None):
print " ("
print " ) ("
print " ___...(-------)-....___"
print " | | | |"
print " \\ \\ | |"
print " `\\ `\\ | |"
- print " `\\ `| |"
- print " _/ /\\ /"
- print " (__/ \\ /"
+ print " `\\ `| SALOME |"
+ print " _/ /\\ 4 EVER /"
+ print " (__/ \\ <3 /"
print " _..---\"\"` \\ /`\"\"---.._"
print " .-\' \\ / \'-."
print " : `-.__ __.-\' :"
print " \'._ \"\"\"----.....______.....----\"\"\" _.\'"
print " `\"\"--..,,_____ _____,,..--\"\"`"
print " `\"\"\"----\"\"\"`"
+ print ""
+ print " SALOME is working for you; what else?"
+ print ""
+ sys.exit(0)
+ #
+
+ def _getCar(self, unused=None):
+ print " _____________"
+ print " ..---:::::::-----------. ::::;;."
+ print " .\'\"\"\"\"\"\" ;; \\ \":."
+ print " .\'\' ; \\ \"\\__."
+ print " .\' ;; ; \\\\\";"
+ print " .\' ; _____; \\\\/"
+ print " .\' :; ;\" \\ ___:\'."
+ print " .\'--........................... : = ____:\" \\ \\"
+ print " ..-\"\" \"\"\"\' o\"\"\" ; ; :"
+ print " .--\"\" .----- ..----... _.- --. ..-\" ; ; ; ;"
+ print " .\"\"_- \"--\"\"-----\'\"\" _-\" .-\"\" ; ; .-."
+ print " .\' .\' SALOME .\" .\" ; ; /. |"
+ print " /-./\' 4 EVER <3 .\" / _.. ; ; ;;;|"
+ print " : ;-.______ / _________==. /_ \\ ; ; ;;;;"
+ print " ; / | \"\"\"\"\"\"\"\"\"\"\".---.\"\"\"\"\"\"\" : /\" \". |; ; _; ;;;"
+ print " /\"-/ | / / / / ;|; ;-\" | ;\';"
+ print ":- : \"\"\"----______ / / ____. . .\"\'. ;; .-\"..T\" ."
+ print "\'. \" ___ \"\": \'\"\"\"\"\"\"\"\"\"\"\"\"\"\" . ; ; ;; ;.\" .\" \'--\""
+ print " \", __ \"\"\" \"\"---... :- - - - - - - - - \' \' ; ; ; ;;\" .\""
+ print " /. ; \"\"\"---___ ; ; ; ;|.\"\""
+ print " : \": \"\"\"----. .-------. ; ; ; ;:"
+ print " \\ \'--__ \\ \\ \\ / | ; ;;"
+ print " \'-.. \"\"\"\"---___ : .______..\\ __/..-\"\"| ; ; ;"
+ print " \"\"--.. \"\"\"--\" m l s . \". . ;"
+ print " \"\"------... ..--\"\" \" :"
+ print " \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\" \\ /"
+ print " \"------\""
+ print ""
+ print " Drive your simulation properly with SALOME!"
+ print ""
sys.exit(0)
#
if not hasattr(self, '_logger'):
self._logger = logging.getLogger(__name__)
#self._logger.setLevel(logging.DEBUG)
- self._logger.setLevel(logging.WARNING)
+ #self._logger.setLevel(logging.WARNING)
+ self._logger.setLevel(logging.ERROR)
return self._logger
#
-###
-import pickle
if __name__ == "__main__":
if len(sys.argv) == 3:
context = pickle.loads(sys.argv[1])
args = pickle.loads(sys.argv[2])
+
(out, err) = context._startSalome(args)
if out:
sys.stdout.write(out)