X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FsalomeRunner.py;h=7a884e2379a2aeb9f12f2281194ac1c814a2e38a;hb=9ed27bb6b3a18d7554fa762bcbfc74d6018843a4;hp=9b9343a63bbcfdc4b898a9b4feb48f39db8f1e26;hpb=6d9c102060aa7ad2e25f3e252ab2c1d57de4d38f;p=modules%2Fkernel.git diff --git a/bin/salomeRunner.py b/bin/salomeRunner.py index 9b9343a63..7a884e237 100644 --- a/bin/salomeRunner.py +++ b/bin/salomeRunner.py @@ -1,6 +1,7 @@ import os import sys import logging +import ConfigParser from parseConfigFile import parseConfigFile from parseConfigFile import convertEnvFileToConfigFile @@ -10,6 +11,15 @@ import pickle import subprocess import platform + +""" +Define a specific exception class to manage exceptions related to SalomeRunner +""" +class SalomeRunnerException(Exception): + """Report error messages to the user interface of SalomeRunner.""" +# + + """ The SalomeRunner class in an API to configure SALOME environment then start SALOME using a single python command. @@ -25,33 +35,42 @@ class SalomeRunner: to .cfg format before setting the environment. """ def __init__(self, configFileNames=[]): + if len(configFileNames) == 0: + raise SalomeRunnerException("No configuration files given") + for filename in configFileNames: basename, extension = os.path.splitext(filename) if extension == ".cfg": self.__setEnvironmentFromConfigFile(filename) elif extension == ".sh": - temp = tempfile.NamedTemporaryFile(suffix='.cfg') + #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) self.__setEnvironmentFromConfigFile(temp.name) + except ConfigParser.ParsingError, e: + self.getLogger().warning("Invalid token found when parsing file: %s\n"%(filename)) + print e + print '\n' finally: # Automatically cleans up the file temp.close() else: - self._getLogger().warning("Unrecognized extension for configuration file: %s", filename) + self.getLogger().warning("Unrecognized extension for configuration file: %s", filename) # def go(self, args): # Run this module as a script, in order to use appropriate Python interpreter # according to current path (initialized from environment files). - absoluteAppliPath = os.environ['ABSOLUTE_APPLI_PATH'] + absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','') proc = subprocess.Popen(['python', absoluteAppliPath+'/bin/salome/salomeRunner.py', pickle.dumps(self), pickle.dumps(args)], shell=False, close_fds=True) proc.wait() # """Append value to PATH environment variable""" def addToPath(self, value): - self.__addToReserved( 'PATH', value) + self.__addToReserved('PATH', value) # """Append value to LD_LIBRARY_PATH environment variable""" @@ -68,17 +87,23 @@ class SalomeRunner: def setEnviron(self, name, value, overwrite=False): env = os.getenv(name, '') if env and not overwrite: - self._getLogger().warning("Environment variable already existing and not overwritten: %s", name) + self.getLogger().warning("Environment variable already existing and not overwritten: %s", name) return if env: - self._getLogger().info("Overwriting environment variable: %s", name) + self.getLogger().info("Overwriting environment variable: %s", name) value = os.path.expandvars(value) # expand environment variables - self._getLogger().debug("Set environment variable: %s=%s", name, value) + self.getLogger().debug("Set environment variable: %s=%s", name, value) os.environ[name] = value # + """Unset environment variable""" + def unsetEnviron(self, name): + if os.environ.has_key(name): + del os.environ[name] + # + ################################### # This begins the private section # ################################### @@ -121,7 +146,7 @@ Commands: } if not command in availableCommands.keys(): - self._getLogger().error("Unrecognized command: %s.", command) + self.getLogger().error("Unrecognized command: %s.", command) self._usage() sys.exit(1) @@ -147,12 +172,21 @@ Commands: try: getattr(self, command)(options) # run appropriate method except AttributeError: - self._getLogger().error("Method %s is not implemented.", command) + self.getLogger().error("Method %s is not implemented.", command) + sys.exit(1) + except: + self.getLogger().error("Unexpected error:") + import traceback + traceback.print_exc() sys.exit(1) # def __setEnvironmentFromConfigFile(self, filename): - configVars, reservedDict = parseConfigFile(filename, reserved=['PATH', 'LD_LIBRARY_PATH', 'PYTHONPATH']) + unsetVars, configVars, reservedDict = parseConfigFile(filename, reserved=['PATH', 'LD_LIBRARY_PATH', 'PYTHONPATH']) + + # unset variables + for var in unsetVars: + self.unsetEnviron(var) # set environment for reserved in reservedDict: @@ -165,7 +199,7 @@ Commands: self.setEnviron(key, val, overwrite=True) pass - sys.path[:0] = os.environ['PYTHONPATH'].split(':') + sys.path[:0] = os.getenv('PYTHONPATH','').split(':') # def __addToReserved(self, name, value): @@ -173,7 +207,7 @@ Commands: return value = os.path.expandvars(value) # expand environment variables - self._getLogger().debug("Add to %s: %s", name, value) + self.getLogger().debug("Add to %s: %s", name, value) env = os.getenv(name, None) if env is None: os.environ[name] = value @@ -211,7 +245,7 @@ Commands: proc = subprocess.Popen(args, shell=False, close_fds=True) proc.wait() else: - absoluteAppliPath = os.environ['ABSOLUTE_APPLI_PATH'] + absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','') cmd = ["/bin/bash", "--rcfile", absoluteAppliPath + "/.bashrc" ] proc = subprocess.Popen(cmd, shell=False, close_fds=True) proc.wait() @@ -268,14 +302,15 @@ Commands: # Ref: http://stackoverflow.com/questions/2999638/how-to-stop-attributes-from-being-pickled-in-python def __getstate__(self): d = dict(self.__dict__) - del d['_logger'] + if hasattr(self, '_logger'): + del d['_logger'] return d # def __setstate__(self, d): self.__dict__.update(d) # I *think* this is a safe way to do it # # Excluding self._logger from pickle operation imply using the following method to access logger - def _getLogger(self): + def getLogger(self): if not hasattr(self, '_logger'): self._logger = logging.getLogger(__name__) #self._logger.setLevel(logging.DEBUG)