X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FsalomeContext.py;h=99fcd113a808e316156248a46c34af6750a1d8a6;hb=561c8837aca34ed658cc6fbe04cf2f8778d824c4;hp=7a5b8e2dba704812af4ce5da248539b600e6834f;hpb=85eb31dcb591c2535c0b0d68c3525f7423888954;p=modules%2Fyacs.git diff --git a/bin/salomeContext.py b/bin/salomeContext.py index 7a5b8e2db..99fcd113a 100755 --- a/bin/salomeContext.py +++ b/bin/salomeContext.py @@ -1,5 +1,5 @@ #! /usr/bin/env python3 -# Copyright (C) 2013-2019 CEA/DEN, EDF R&D, OPEN CASCADE +# 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 @@ -28,6 +28,7 @@ from parseConfigFile import parseConfigFile import tempfile import pickle import subprocess +import sys import platform from salomeContextUtils import SalomeContextException @@ -45,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. @@ -102,17 +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: - print('Module environment not present') + 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") except: - print("** Failed **") + raise SalomeContextException("Failed to load env modules: %s ..." % ' '.join(env_modules)) pass # @@ -135,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 # @@ -147,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: @@ -183,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): @@ -218,6 +226,7 @@ class SalomeContext: 'start' : '_runAppli', 'context' : '_setContext', 'shell' : '_runSession', + 'remote' : '_runRemote', 'connect' : '_runConsole', 'kill' : '_kill', 'killall' : '_killAll', @@ -286,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) @@ -311,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 @@ -344,7 +361,10 @@ 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 @@ -364,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 = [] @@ -384,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 @@ -625,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)