1 // SALOME SALOMEGUI : implementation of desktop and GUI kernel
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : PythonConsole_PyInterp.cxx
25 // Author : Nicolas REJNERI
29 #include "PythonConsole_PyInterp.h"
30 //#include "utilities.h"
36 //static int MYDEBUG = 0;
38 //static int MYDEBUG = 0;
43 * constructor : multi Python interpreter, one per SALOME study.
44 * calls initialize method defined in base class, which calls virtual methods
45 * initstate & initcontext redefined here.
47 PythonConsole_PyInterp::PythonConsole_PyInterp(): PyInterp_base()
54 PythonConsole_PyInterp::~PythonConsole_PyInterp()
60 * When SALOME uses multi Python interpreter feature,
61 * Every study has its own interpreter and thread state (_tstate = Py_NewInterpreter())
62 * This is fine because every study has its own modules (sys.modules) stdout and stderr
63 * BUT some Python modules must be imported only once. In multi interpreter context Python
64 * modules (*.py) are imported several times.
65 * The pyqt module must be imported only once because it registers classes in a C module.
66 * It's quite the same with omniorb modules (internals and generated with omniidl)
67 * This problem is handled with "shared modules" defined in salome_shared_modules.py
68 * These "shared modules" are imported only once and only copied in all the other interpreters
69 * BUT it's not the only problem. Every interpreter has its own __builtin__ module. That's fine
70 * but if we have copied some modules and imported others problems may arise with operations that
71 * are not allowed in restricted execution environment. So we must impose that all interpreters
72 * have identical __builtin__ module.
73 * That's all, for the moment ...
76 bool PythonConsole_PyInterp::initState()
79 * The GIL is acquired and will be held on initState output
80 * It is the caller responsability to release the lock if needed
83 _tstate = Py_NewInterpreter(); // create an interpreter and save current state
84 PySys_SetArgv(PyInterp_base::_argc,PyInterp_base::_argv); // initialize sys.argv
85 // if(MYDEBUG) MESSAGE("PythonConsole_PyInterp::initState - this = "<<this<<"; _tstate = "<<_tstate);
88 * If builtinmodule has been initialized all the sub interpreters
89 * will have the same __builtin__ module
92 PyObject *m = PyImport_GetModuleDict();
93 PyDict_SetItemString(m, "__builtin__", builtinmodule);
94 // SCRUTE(builtinmodule->ob_refcnt); // builtinmodule reference counter
95 _tstate->interp->builtins = PyModule_GetDict(builtinmodule);
96 Py_INCREF(_tstate->interp->builtins);
98 PyEval_ReleaseThread(_tstate);
103 The GIL is assumed to be held
104 It is the caller responsability caller to acquire the GIL
105 It will still be held on initContext output
107 bool PythonConsole_PyInterp::initContext()
109 PyObject *m = PyImport_AddModule("__main__"); // interpreter main module (module context)
111 // if(MYDEBUG) MESSAGE("problem...");
116 _g = PyModule_GetDict(m); // get interpreter dictionnary context
117 // if(MYDEBUG) MESSAGE("PythonConsole_PyInterp::initContext - this = "<<this<<"; _g = "<<_g);
120 PyDict_SetItemString(_g, "__builtins__", builtinmodule); // assign singleton __builtin__ module