2 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2022-2023 CEA, EDF, OPEN CASCADE
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License, or (at your option) any later version.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 # \brief Module that provides services to launch SALOME
26 import sys, os, string, glob, time, pickle, re
28 from server import process_id, Server
31 from salomeContextUtils import ScriptAndArgsObjectEncoder
32 import runSalomeNoServer
33 import runSalomeCommon
35 import runSalomeOnDemand
36 from launchConfigureParser import verbosity_nam, on_demand_nam
38 logger = logging.getLogger()
40 # -----------------------------------------------------------------------------
42 from killSalome import killAllPorts
44 def kill_salome(args):
46 Kill servers from previous SALOME executions, if needed;
47 depending on args 'killall' or 'portkill', kill all executions,
48 or only execution on the same CORBA port
54 # -----------------------------------------------------------------------------
57 """Salome Session Graphic User Interface activation"""
61 import SALOME_ModuleCatalog
62 import SALOME_Session_idl
63 session=clt.waitNS("/Kernel/Session",SALOME.Session)
64 session.GetInterface()
66 # -----------------------------------------------------------------------------
68 def startSalome(args, modules_list, modules_root_dir):
69 """Launch all SALOME servers requested by args"""
70 init_time = os.times()
72 logger.debug("startSalome : {} ".format(args))
74 ior_fakens_filename = None
76 # Launch Session Server (to show splash ASAP)
79 if args["gui"] and not args['launcher_only']:
80 mySessionServ = runSalomeNoServer.NoSessionServer(args,args['modules'],modules_root_dir)
81 mySessionServ.setpath(modules_list,modules_root_dir)
83 ior_fakens_filename = mySessionServ.iorfakens
84 logger.debug("Rendez-vous file for to retrieve IOR of session is \"{}\"".format(ior_fakens_filename))
89 # Wait until Session Server is registered in naming service
91 logger.debug("Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4]))
94 # additional external python interpreters
100 nbaddi = args['interp']
103 traceback.print_exc()
104 logger.error("-------------------------------------------------------------")
105 logger.error("-- to get an external python interpreter:runSalome --interp=1")
106 logger.error("-------------------------------------------------------------")
108 logger.debug("additional external python interpreters: {}".format(nbaddi))
110 for i in range(nbaddi):
111 anInterp=runSalomeCommon.InterpServer(args)
114 # set PYTHONINSPECT variable (python interpreter in interactive mode)
116 os.environ["PYTHONINSPECT"]="1"
122 return ior_fakens_filename
124 # -----------------------------------------------------------------------------
126 def useSalome(args, modules_list, modules_root_dir):
128 Launch all SALOME servers requested by args,
129 save list of process, give info to user,
130 show registered objects in Naming Service.
133 ior_fakens_filename = None
135 ior_fakens_filename = startSalome(args, modules_list, modules_root_dir)
138 traceback.print_exc()
139 logger.error("--- Error during Salome launch ---")
143 from addToKillList import addToKillList
144 from killSalomeWithPort import getPiDict
146 filedict = getPiDict(args['port'])
147 for pid, cmd in list(process_id.items()):
148 addToKillList(pid, cmd, args['port'])
152 Saving of the dictionary of Salome processes in %s
153 To kill SALOME processes from a console (kill all sessions from all ports):
155 To kill SALOME from the present interpreter, if it is not closed :
156 killLocalPort() --> kill this session
157 (use CORBA port from args of runSalome)
158 givenPortKill(port) --> kill a specific session with given CORBA port
159 killAllPorts() --> kill all sessions
161 runSalome, with --killall option, starts with killing
162 the processes resulting from the previous execution.
165 return ior_fakens_filename
167 def execScript(script_path):
168 print('executing', script_path)
169 sys.path.insert(0, os.path.realpath(os.path.dirname(script_path)))
170 exec(compile(open(script_path).read(), script_path, 'exec'),globals())
173 # -----------------------------------------------------------------------------
175 def main(exeName=None):
176 """Salome launch as a main application"""
177 keep_env = not os.getenv('SALOME_PLEASE_SETUP_ENVIRONMENT_AS_BEFORE')
178 args, modules_list, modules_root_dir = setenv.get_config(exeName=exeName, keepEnvironment=keep_env)
179 runSalomeCommon.setVerbose(args[verbosity_nam])
184 # Setup extension's env in salome on demand case
185 if args[on_demand_nam]:
186 runSalomeOnDemand.set_ext_env()
187 # Reset up module_list and modules_root_dir, if we dont want to define SalomeAppConfig on salome.py.
188 # We must remove the "else" on "if os.sys.platform == 'win32':" in launcheConfigureParser.py too.
189 args, _, __ = setenv.get_config(exeName=exeName, keepEnvironment=keep_env)
191 setenv.set_env(args, modules_list, modules_root_dir, keepEnvironment=keep_env)
192 ior_fakens_filename = useSalome(args, modules_list, modules_root_dir)
193 # Management of -t <script.py>
196 if 'gui' in args and 'session_gui' in args:
197 if not args['gui'] or not args['session_gui']:
198 if 'study_hdf' in args:
199 toopen = args['study_hdf']
201 os.environ["PATH_TO_STUDY_FILE_TO_INITIATE"] = toopen
202 logger.debug("An input Study has been specified {} -> pass it with PATH_TO_STUDY_FILE_TO_INITIATE env var".format(toopen))
203 if 'pyscript' in args:
204 toimport = args['pyscript']
205 from salomeContextUtils import formatScriptsAndArgs
206 from addToKillList import addToKillList
207 command = formatScriptsAndArgs(toimport, escapeSpaces=True)
209 logger.debug("Launching following shell command : {}".format(str(command)))
210 proc = subprocess.Popen(command, shell=True, env = env)
211 addToKillList(proc.pid, command)
214 return args, ior_fakens_filename
216 # -----------------------------------------------------------------------------
218 def foreGround(args, ior_fakens_filename):
225 if ior_fakens_filename is None:
226 logger.warn("No file set to host IOR of the fake naming server")
228 if not os.path.exists(ior_fakens_filename):
229 logger.warn("No file {} set to host IOR of the fake naming server does not exit !")
234 from time import sleep
235 orb = CORBA.ORB_init([''], CORBA.ORB_ID)
240 ior_fakens = orb.string_to_object(open(ior_fakens_filename).read())
241 session = orb.string_to_object(ior_fakens.Resolve("/Kernel/Session").decode())
244 if ( session is not None ) and (not CORBA.is_nil(session)):
246 os.remove(ior_fakens_filename)
247 logger.debug("File {} has been removed".format(ior_fakens_filename))
250 logger.debug("Session in child process has been found ! yeah ! {}".format(str(session)))
254 logger.debug("Unfortunately Session not found into {} : Sleep and retry. {}/{}".format(ior_fakens_filename,nb,nbtot))
259 logger.debug("Couldn't find /Kernel/Session in the child process. Return.")
264 # Wait until gui is arrived
270 status = session.GetStatSession()
271 gui_detected = status.activeGUI
272 session_pid = session.getPID()
273 logger.debug("Process of the session under monitoring {}".format(session_pid))
285 logger.debug("Couldn't find active GUI in the current session. Return.")
288 from salome_utils import getPortNumber
289 port = getPortNumber()
295 status = session.GetStatSession()
296 assert status.activeGUI
298 logger.debug("Process of the session under monitoring {} has vanished !".format(session_pid))
300 from time import sleep
304 except KeyboardInterrupt:
305 logger.debug("Keyboard requested : killing all process attached to port {}".format(port))
307 from killSalomeWithPort import killProcessSSL
308 killProcessSSL(port,[session_pid])
313 args, ior_fakens_filename = main()
315 test = args['gui'] and args['session_gui']
316 test = test and not args[on_demand_nam]
317 test = test or args['wake_up_session']
319 # The next test covers the --pinter option or if var PYTHONINSPECT is set
321 test = test and not os.environ.get('PYTHONINSPECT')
323 # The next test covers the python -i $KERNEL_ROOT_DIR/bin/salome/runSalome.py case
326 from ctypes import POINTER, c_int, cast, pythonapi
327 iflag_ptr = cast(pythonapi.Py_InteractiveFlag, POINTER(c_int))
328 test = test and not iflag_ptr.contents.value
332 # test = test and os.getenv("SALOME_TEST_MODE", "0") != "1"
333 test = test and args['foreground']
336 from time import sleep
338 foreGround(args, ior_fakens_filename)
343 # -----------------------------------------------------------------------------
345 if __name__ == "__main__":