X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FsalomeContext.py;h=99fcd113a808e316156248a46c34af6750a1d8a6;hb=561c8837aca34ed658cc6fbe04cf2f8778d824c4;hp=f80d714812d6e4dc2c19fb3dcfc622e9f989df60;hpb=d9ed049b89cfff4d8d96f0247ac5f2ec0200e3d0;p=modules%2Fyacs.git diff --git a/bin/salomeContext.py b/bin/salomeContext.py old mode 100644 new mode 100755 index f80d71481..99fcd113a --- a/bin/salomeContext.py +++ b/bin/salomeContext.py @@ -1,4 +1,5 @@ -# Copyright (C) 2013-2017 CEA/DEN, EDF R&D, OPEN CASCADE +#! /usr/bin/env python3 +# Copyright (C) 2013-2020 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 @@ -27,6 +28,7 @@ from parseConfigFile import parseConfigFile import tempfile import pickle import subprocess +import sys import platform from salomeContextUtils import SalomeContextException @@ -44,6 +46,7 @@ Commands: User works in a Shell terminal. SALOME environment is set but application is not started. connect Connect a Python console to the active SALOME instance. + remote run command in SALOME environment from remote call, ssh or rsh. kill Terminate SALOME instances running on given ports for current user. Port numbers must be separated by blank characters. killall Terminate *all* SALOME running instances for current user. @@ -64,7 +67,7 @@ Command options: --config= ========================== Initialize SALOME context from a list of context files and/or a list - of folders containing context files. The list is comma-separated, whithout + of folders containing context files. The list is comma-separated, without any blank characters. ''' @@ -84,7 +87,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 [] @@ -101,13 +104,15 @@ class SalomeContext: # def __loadEnvModules(self, env_modules): - print("Trying to load env modules: %s..." % ' '.join(env_modules)) + modulecmd = os.getenv('LMOD_CMD') + if not modulecmd: + raise SalomeContextException("Module environment not present") + return try: - out, err = subprocess.Popen(["modulecmd", "python", "load"] + env_modules, stdout=subprocess.PIPE).communicate() - exec(out) # define specific environment variables - print("OK") + out, err = subprocess.Popen([modulecmd, "python", "load"] + env_modules, stdout=subprocess.PIPE).communicate() + exec(out) # define specific environment variables except: - print("** Failed **") + raise SalomeContextException("Failed to load env modules: %s ..." % ' '.join(env_modules)) pass # @@ -130,7 +135,7 @@ class SalomeContext: env_copy = os.environ.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) + proc = subprocess.Popen(['python3', os.path.join(absoluteAppliPath,"bin","salome","salomeContext.py"), selfBytes.decode('latin1'), argsBytes.decode('latin1')], shell=False, close_fds=True, env=env_copy) out, err = proc.communicate() return out, err, proc.returncode # @@ -142,9 +147,9 @@ class SalomeContext: """Append value to LD_LIBRARY_PATH environment variable""" def addToLdLibraryPath(self, value): - if platform.system() == 'Windows': + if sys.platform == 'win32': self.addToVariable('PATH', value) - elif platform.system() == 'Darwin': + elif sys.platform == 'darwin': if "LAPACK" in value: self.addToVariable('DYLD_FALLBACK_LIBRARY_PATH', value) else: @@ -178,6 +183,14 @@ class SalomeContext: os.environ[name] = value # + def setDefaultValue(self, name, value): + """ Set environment variable only if it is undefined.""" + env = os.getenv(name, '') + if not env: + value = os.path.expandvars(value) # expand environment variables + self.getLogger().debug("Set environment variable: %s=%s", name, value) + os.environ[name] = value + """Unset environment variable""" def unsetVariable(self, name): if os.environ.has_key(name): @@ -213,6 +226,7 @@ class SalomeContext: 'start' : '_runAppli', 'context' : '_setContext', 'shell' : '_runSession', + 'remote' : '_runRemote', 'connect' : '_runConsole', 'kill' : '_kill', 'killall' : '_killAll', @@ -233,7 +247,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): @@ -281,7 +295,11 @@ class SalomeContext: if reserved is None: reserved = [] try: - unsetVars, configVars, reservedDict = parseConfigFile(filename, reserved) + configInfo = parseConfigFile(filename, reserved) + unsetVars = configInfo.unsetVariables + configVars = configInfo.outputVariables + reservedDict = configInfo.reservedValues + defaultValues = configInfo.defaultValues except SalomeContextException as e: msg = "%s"%e self.getLogger().error(msg) @@ -306,6 +324,10 @@ class SalomeContext: self.setVariable(key, val, overwrite=True) pass + for key,val in defaultValues: + self.setDefaultValue(key, val) + pass + pythonpath = os.getenv('PYTHONPATH','').split(os.pathsep) pythonpath = [ os.path.realpath(x) for x in pythonpath ] sys.path[:0] = pythonpath @@ -339,10 +361,13 @@ class SalomeContext: print("*** Enter 'exit' (only once!) to leave SALOME context.") print("***") - cmd = ["/bin/bash"] + if sys.platform == 'win32': + cmd = ['cmd.exe'] + else: + cmd = ["/bin/bash"] proc = subprocess.Popen(cmd, shell=False, close_fds=True) proc.communicate() - return proc.returncode() + return proc.returncode # def _runSession(self, args=None): @@ -359,6 +384,18 @@ class SalomeContext: return runSession.runSession(params, args) # + def _runRemote(self, args=None): + if args is None: + args = [] +# complete salome environment + sys.argv = ['runRemote'] + import setenv + setenv.main(True) + + import runRemote + return runRemote.runRemote(args) + # + def _runConsole(self, args=None): if args is None: args = [] @@ -379,31 +416,34 @@ class SalomeContext: print("Port number(s) not provided to command: salome kill ") return 1 - from multiprocessing import Process - from killSalomeWithPort import killMyPort - import tempfile + import subprocess + sys.argv = ['kill'] + import setenv + setenv.main(True) + if os.getenv("NSHOST") == "no_host": + os.unsetenv("NSHOST") for port in ports: - with tempfile.NamedTemporaryFile(): - p = Process(target = killMyPort, args=(port,)) - p.start() - p.join() + proc = subprocess.Popen(["killSalomeWithPort.py", port]) + proc.communicate() + return 0 # def _killAll(self, unused=None): + sys.argv = ['killAll'] + import setenv + setenv.main(True) + if os.getenv("NSHOST") == "no_host": + os.unsetenv("NSHOST") try: import PortManager # mandatory - from multiprocessing import Process - from killSalomeWithPort import killMyPort + import subprocess ports = PortManager.getBusyPorts()['this'] if ports: - import tempfile for port in ports: - with tempfile.NamedTemporaryFile(): - p = Process(target = killMyPort, args=(port,)) - p.start() - p.join() + proc = subprocess.Popen(["killSalomeWithPort.py", str(port)]) + proc.communicate() except ImportError: # :TODO: should be declared obsolete from killSalome import killAllPorts @@ -442,12 +482,12 @@ class SalomeContext: pass if softwares: for soft in softwares: - if versions.has_key(soft.upper()): + if soft.upper() in versions: print(soft.upper().rjust(max_len), versions[soft.upper()]) else: import collections od = collections.OrderedDict(sorted(versions.items())) - for name, version in od.iteritems(): + for name, version in od.items(): print(name.rjust(max_len), versions[name]) pass @@ -620,8 +660,8 @@ Available options are: if __name__ == "__main__": if len(sys.argv) == 3: - context = pickle.loads(sys.argv[1].encode()) - args = pickle.loads(sys.argv[2].encode()) + context = pickle.loads(sys.argv[1].encode('latin1')) + args = pickle.loads(sys.argv[2].encode('latin1')) status = context._startSalome(args) sys.exit(status)