From: Gilles DAVID Date: Tue, 18 Apr 2017 13:23:17 +0000 (+0200) Subject: Merge remote-tracking branch 'origin/V8_3_BR' into ngr/python3_dev X-Git-Tag: V9_0_0~7^2~8 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=6ea08066cb76ea0e557d89789037f3fd1a03e0fb;hp=dd427383559132dd5c0add8f0b1ab2f71d8514c3;p=modules%2Fgui.git Merge remote-tracking branch 'origin/V8_3_BR' into ngr/python3_dev --- diff --git a/src/GUI_PY/dockwidgets.py b/src/GUI_PY/dockwidgets.py index 08a9bc77b..5d4306424 100644 --- a/src/GUI_PY/dockwidgets.py +++ b/src/GUI_PY/dockwidgets.py @@ -43,7 +43,7 @@ def findDockWidgetByTitle( title ): """ sg = SalomePyQt.SalomePyQt() dwl = sg.getDesktop().findChildren( QDockWidget ) - dw = filter(lambda a: a.windowTitle() == str( title ), dwl) + dw = [a for a in dwl if a.windowTitle() == str( title )] if dw: return dw[0] return None diff --git a/src/GUI_PY/genericdialog.py b/src/GUI_PY/genericdialog.py index 2a310a4e7..78183833b 100644 --- a/src/GUI_PY/genericdialog.py +++ b/src/GUI_PY/genericdialog.py @@ -18,12 +18,9 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -__author__="gboulant" -__date__ ="$31 mars 2010 17:09:53$" - from qtsalome import QDialog, QMessageBox +from salome.gui.genericdialog_ui import Ui_GenericDialog -from genericdialog_ui import Ui_GenericDialog class GenericDialog(QDialog): """ @@ -120,9 +117,9 @@ def TEST_GenericDialog(): dlg=GenericDialog() dlg.displayAndWait() if dlg.wasOk(): - print "OK has been pressed" + print("OK has been pressed") else: - print "Cancel has been pressed" + print("Cancel has been pressed") if __name__ == "__main__": TEST_GenericDialog() diff --git a/src/GUI_PY/helper.py b/src/GUI_PY/helper.py index 3b11a48d0..670cc5ecb 100644 --- a/src/GUI_PY/helper.py +++ b/src/GUI_PY/helper.py @@ -103,7 +103,7 @@ def showSObjectSelected(): test, attr = sobj.FindAttribute( "AttributeName" ) if test: message = "My name is '%s'" % attr.Value() - print message + print(message) pass def deleteSObjectSelected(): @@ -140,7 +140,7 @@ def deleteSObjectSelected(): def TEST_getSObjectSelected(): mySObject, myEntry = getSObjectSelected() myName = mySObject.GetName() - print "The name of the selected object is %s"%myName + print("The name of the selected object is %s"%myName) def TEST_showSObjectSelected(): showSObjectSelected() diff --git a/src/GUI_PY/mytestdialog.py b/src/GUI_PY/mytestdialog.py index 2c975c113..baa2d7826 100644 --- a/src/GUI_PY/mytestdialog.py +++ b/src/GUI_PY/mytestdialog.py @@ -18,11 +18,10 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -__author__="gboulant" -__date__ ="$31 mars 2010 17:09:53$" from qtsalome import * -from mytestdialog_ui import Ui_MyTestDialog -from genericdialog import GenericDialog +from salome.gui.genericdialog import GenericDialog +from salome.gui.mytestdialog_ui import Ui_MyTestDialog + class MyTestDialog(GenericDialog): """ @@ -115,12 +114,12 @@ def TEST_MyTestDialog_modal(): dlg.displayAndWait() if dlg.wasOk(): name = dlg.getData() - print "The name has been modified to",name + print("The name has been modified to",name) class DialogListener: def onProcessEvent(self): - print "onProcessEvent(): OK has been pressed" + print("onProcessEvent(): OK has been pressed") import sys sys.exit(0) diff --git a/src/GUI_PY/selectvars.py b/src/GUI_PY/selectvars.py index 073868201..b98138401 100644 --- a/src/GUI_PY/selectvars.py +++ b/src/GUI_PY/selectvars.py @@ -134,7 +134,7 @@ class MySelectVarsDialog(Ui_SelectVarsDialog, QDialog): filename = str(filename) exchange_variables = study_exchange_vars.loadExchangeVariablesFromXmlFile(filename) self.setExchangeVariables(exchange_variables) - except Exception, e: + except Exception as e: QMessageBox.critical(self, self.tr("Error"), self.tr("Cannot load file %s:\n%s" % (filename, e))) @@ -148,6 +148,6 @@ class MySelectVarsDialog(Ui_SelectVarsDialog, QDialog): filename = str(filename) exchange_variables = self.getSelectedExchangeVariables() exchange_variables.saveToXmlFile(filename) - except Exception, e: + except Exception as e: QMessageBox.critical(self, self.tr("Error"), self.tr("Cannot save file %s:\n%s" % (filename, e))) diff --git a/src/GUI_PY/test_dockwidgets.py b/src/GUI_PY/test_dockwidgets.py index d51d52344..bf5805eaa 100644 --- a/src/GUI_PY/test_dockwidgets.py +++ b/src/GUI_PY/test_dockwidgets.py @@ -1,45 +1,45 @@ from salome.gui.dockwidgets import * -print "-- Search dock windows by title" +print("-- Search dock windows by title") ob = findDockWidgetByTitle( "Object Browser" ) if ob: - print "object browser:", ob + print("object browser:", ob) else: - print "object browser was not found" + print("object browser was not found") pc = findDockWidgetByTitle( "Python Console" ) if pc: - print "python console:", pc + print("python console:", pc) else: - print "python console was not found" -print + print("python console was not found") +print() -print "-- Search dock windows by name" +print("-- Search dock windows by name") ob = findDockWidgetByName( "objectBrowserDock" ) if ob: - print "object browser:", ob + print("object browser:", ob) else: - print "object browser was not found" + print("object browser was not found") pc = findDockWidgetByName( "pythonConsoleDock" ) if pc: - print "python console:", pc + print("python console:", pc) else: - print "python console was not found" -print + print("python console was not found") +print() -print "-- Search dock windows by id" +print("-- Search dock windows by id") ob = findDockWidgetById( SalomePyQt.WT_ObjectBrowser ) if ob: - print "object browser:", ob + print("object browser:", ob) else: - print "object browser was not found" + print("object browser was not found") pc = findDockWidgetById( SalomePyQt.WT_PyConsole ) if pc: - print "python console:", pc + print("python console:", pc) else: - print "python console was not found" -print + print("python console was not found") +print() -print "-- Tabify dock windows" +print("-- Tabify dock windows") tabifyDockWidgets( findDockWidgetById( SalomePyQt.WT_ObjectBrowser ), findDockWidgetById( SalomePyQt.WT_PyConsole ) ) diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index da1936388..24c8f40ff 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -35,8 +35,8 @@ #endif #ifndef DISABLE_PYCONSOLE - #include "LightApp_PyEditor.h" #include "PyConsole_Interp.h" + #include "LightApp_PyEditor.h" #include "PyConsole_Console.h" #endif diff --git a/src/PVServerService/PVServer_ServiceWrapper.cxx b/src/PVServerService/PVServer_ServiceWrapper.cxx index 8c4004065..584a4da91 100644 --- a/src/PVServerService/PVServer_ServiceWrapper.cxx +++ b/src/PVServerService/PVServer_ServiceWrapper.cxx @@ -102,7 +102,7 @@ std::string PVServer_ServiceWrapper::FindOrStartPVServer(int port) PyErr_Print(); throw SALOME_Exception("Unable to invoke PVSERVER service!"); } - return std::string(PyString_AsString(obj)); + return std::string(PyUnicode_AsUTF8(obj)); } diff --git a/src/PVServerService/ServiceLoader/CMakeLists.txt b/src/PVServerService/ServiceLoader/CMakeLists.txt index ee65c5237..7e5c65ece 100644 --- a/src/PVServerService/ServiceLoader/CMakeLists.txt +++ b/src/PVServerService/ServiceLoader/CMakeLists.txt @@ -58,7 +58,7 @@ INSTALL(TARGETS PVServerServiceLoader EXPORT ${PROJECT_NAME}TargetGroup DESTINAT # --- SWIG part --- SET_SOURCE_FILES_PROPERTIES(${_SWIG} PROPERTIES CPLUSPLUS ON) -SET_SOURCE_FILES_PROPERTIES(${_SWIG} PROPERTIES SWIG_DEFINITIONS "-shadow") +SET_SOURCE_FILES_PROPERTIES(${_SWIG} PROPERTIES SWIG_FLAGS "-py3") SWIG_ADD_MODULE(PVServer_ServiceLoader python ${_SWIG}) IF(WIN32) SET_TARGET_PROPERTIES(_PVServer_ServiceLoader PROPERTIES DEBUG_OUTPUT_NAME _PVServer_ServiceLoader_d) diff --git a/src/Plot2d/Plot2d_AnalyticalParser.cxx b/src/Plot2d/Plot2d_AnalyticalParser.cxx index 23b62a5b5..2fd2acb1d 100755 --- a/src/Plot2d/Plot2d_AnalyticalParser.cxx +++ b/src/Plot2d/Plot2d_AnalyticalParser.cxx @@ -71,8 +71,8 @@ namespace { static PyTypeObject PyStdOut_Type = { /* The ob_type field must be initialized in the module init function * to be portable to Windows without using C++. */ - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT(NULL, 0) + /* 0, */ /*ob_size*/ "PyOut", /*tp_name*/ sizeof(PyStdOut), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/src/SALOME_PY/SalomePy.cxx b/src/SALOME_PY/SalomePy.cxx index d099217b9..ed7ce5028 100755 --- a/src/SALOME_PY/SalomePy.cxx +++ b/src/SALOME_PY/SalomePy.cxx @@ -91,10 +91,10 @@ { \ PyObject *w; \ int rc; \ - if ( ( w = PyInt_FromLong( i ) ) == NULL ) return; \ + if ( ( w = PyLong_FromLong( i ) ) == NULL ) return NULL; \ rc = PyDict_SetItemString( aModuleDict, #i, w ); \ Py_DECREF( w ); \ - if ( rc < 0 ) return; \ + if ( rc < 0 ) return NULL; \ } //! View operation type @@ -494,7 +494,7 @@ extern "C" SALOMEPY_EXPORT PyObject* libSalomePy_resetView( PyObject* self, PyOb return Py_None; } -static PyMethodDef Module_Methods[] = +static PyMethodDef libSalomePy_methods[] = { { "getRenderer", libSalomePy_getRenderer, METH_VARARGS }, { "getRenderWindow", libSalomePy_getRenderWindow, METH_VARARGS }, @@ -506,25 +506,51 @@ static PyMethodDef Module_Methods[] = { NULL, NULL } }; +struct module_state { + PyObject *error; +}; + +#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m)) + +static int libSalomePy_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(GETSTATE(m)->error); + return 0; +} + +static int libSalomePy_clear(PyObject *m) { + Py_CLEAR(GETSTATE(m)->error); + return 0; +} + +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "libSalomePy", + NULL, + sizeof(struct module_state), + libSalomePy_methods, + NULL, + libSalomePy_traverse, + libSalomePy_clear, + NULL +}; + /*! \brief Python module initialization. \internal */ -extern "C" SALOMEPY_EXPORT void initlibSalomePy() +extern "C" SALOMEPY_EXPORT PyMODINIT_FUNC PyInit_libSalomePy(void) { - static char* modulename = (char*)"libSalomePy"; - // init module - PyObject* aModule = Py_InitModule( modulename, Module_Methods ); + PyObject *aModule = PyModule_Create(&moduledef); if( PyErr_Occurred() ) { PyErr_Print(); - return; + return NULL; } // get module's dictionary PyObject *aModuleDict = PyModule_GetDict( aModule ); if ( aModuleDict == NULL ) - return; + return NULL; // export View type enumeration PUBLISH_ENUM( ViewFront ); @@ -533,4 +559,6 @@ extern "C" SALOMEPY_EXPORT void initlibSalomePy() PUBLISH_ENUM( ViewBottom ); PUBLISH_ENUM( ViewRight ); PUBLISH_ENUM( ViewLeft ); + + return aModule; } diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx index 069e070f3..b1cb8ec9e 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx @@ -45,7 +45,7 @@ // and to get C API from sip : sipBuildResult for example // -#define INIT_FUNCTION initSalomePyQtGUILight +#define INIT_FUNCTION PyInit_SalomePyQtGUILight #if defined(SIP_STATIC_MODULE) extern "C" void INIT_FUNCTION(); #else diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx index 1cdcb36fc..e405a40fa 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx @@ -20,8 +20,8 @@ // File : SALOME_PYQT_ModuleLight.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -#include "SALOME_PYQT_DataModelLight.h" #include "SALOME_PYQT_ModuleLight.h" +#include "SALOME_PYQT_DataModelLight.h" #include "SALOME_PYQT_PyModule.h" #include "SALOME_PYQT_Selector.h" @@ -63,7 +63,7 @@ // and to get C API from sip : sipBuildResult for example // -#define INIT_FUNCTION initSalomePyQtGUILight +#define INIT_FUNCTION PyInit_SalomePyQtGUILight #if defined(SIP_STATIC_MODULE) extern "C" void INIT_FUNCTION(); #else diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyInterp.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyInterp.cxx index 519e59457..7bf711853 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyInterp.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyInterp.cxx @@ -77,7 +77,7 @@ int SALOME_PYQT_PyInterp::run(const char *command) PyErr_Print(); return -1; } - PyObject *r = PyEval_EvalCode((PyCodeObject *)code,_global_context,_local_context); + PyObject *r = PyEval_EvalCode((PyObject *)code,_global_context,_local_context); Py_DECREF(code); if(!r){ diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx index e6ba25f84..459839a9b 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx @@ -1952,9 +1952,9 @@ void PyModuleHelper::internalInitialize( CAM_Application* app ) // parse the return value // it should be a map: {integer:integer} int aKey, aValue; - if( key && PyInt_Check( key ) && value && PyInt_Check( value ) ) { - aKey = PyInt_AsLong( key ); - aValue = PyInt_AsLong( value ); + if( key && PyLong_Check( key ) && value && PyLong_Check( value ) ) { + aKey = PyLong_AsLong( key ); + aValue = PyLong_AsLong( value ); myWindowsMap[ aKey ] = aValue; } } @@ -1972,16 +1972,16 @@ void PyModuleHelper::internalInitialize( CAM_Application* app ) else { // parse the return value // result can be one string... - if ( PyString_Check( res2 ) ) { - myViewMgrList.append( PyString_AsString( res2 ) ); + if ( PyUnicode_Check( res2 ) ) { + myViewMgrList.append( PyUnicode_AsUTF8( res2 ) ); } // ... or list of strings else if ( PyList_Check( res2 ) ) { int size = PyList_Size( res2 ); for ( int i = 0; i < size; i++ ) { PyObject* value = PyList_GetItem( res2, i ); - if( value && PyString_Check( value ) ) { - myViewMgrList.append( PyString_AsString( value ) ); + if( value && PyUnicode_Check( value ) ) { + myViewMgrList.append( PyUnicode_AsUTF8( value ) ); } } } @@ -2535,8 +2535,8 @@ void PyModuleHelper::internalSave( QStringList& files, const QString& url ) else { // parse the return value // result can be one string... - if ( PyString_Check( res ) ) { - QString astr = PyString_AsString( res ); + if ( PyUnicode_Check( res ) ) { + QString astr = PyUnicode_AsUTF8( res ); files.append( astr ); } //also result can be a list... @@ -2544,8 +2544,8 @@ void PyModuleHelper::internalSave( QStringList& files, const QString& url ) int size = PyList_Size( res ); for ( int i = 0; i < size; i++ ) { PyObject* value = PyList_GetItem( res, i ); - if ( value && PyString_Check( value ) ) { - files.append( PyString_AsString( value ) ); + if ( value && PyUnicode_Check( value ) ) { + files.append( PyUnicode_AsUTF8( value ) ); } } } @@ -2623,8 +2623,8 @@ void PyModuleHelper::internalDumpPython( QStringList& files ) else { // parse the return value // result can be one string... - if ( PyString_Check( res ) ) { - QString astr = PyString_AsString( res ); + if ( PyUnicode_Check( res ) ) { + QString astr = PyUnicode_AsUTF8( res ); //SCRUTE(astr); files.append(astr); } @@ -2633,8 +2633,8 @@ void PyModuleHelper::internalDumpPython( QStringList& files ) int size = PyList_Size( res ); for ( int i = 0; i < size; i++ ) { PyObject* value = PyList_GetItem( res, i ); - if( value && PyString_Check( value ) ) { - files.append( PyString_AsString( value ) ); + if( value && PyUnicode_Check( value ) ) { + files.append( PyUnicode_AsUTF8( value ) ); } } } @@ -2776,8 +2776,8 @@ QString PyModuleHelper::internalEngineIOR() const } else { // parse the return value, result chould be string - if ( PyString_Check( res ) ) { - ior = PyString_AsString( res ); + if ( PyUnicode_Check( res ) ) { + ior = PyUnicode_AsUTF8( res ); } } } diff --git a/src/SALOME_SWIG/CMakeLists.txt b/src/SALOME_SWIG/CMakeLists.txt index c68378d4b..0b3c1a2fe 100755 --- a/src/SALOME_SWIG/CMakeLists.txt +++ b/src/SALOME_SWIG/CMakeLists.txt @@ -49,7 +49,7 @@ INCLUDE_DIRECTORIES( # swig flags SET_SOURCE_FILES_PROPERTIES(libSALOME_Swig.i PROPERTIES CPLUSPLUS ON) -SET_SOURCE_FILES_PROPERTIES(libSALOME_Swig.i PROPERTIES SWIG_DEFINITIONS "-shadow") +SET_SOURCE_FILES_PROPERTIES(libSALOME_Swig.i PROPERTIES SWIG_FLAGS "-py3") SET_SOURCE_FILES_PROPERTIES(libSALOME_SwigPYTHON_wrap.cxx PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H") # additional preprocessor / compiler flags diff --git a/src/SALOME_SWIG/test_big_table.py b/src/SALOME_SWIG/test_big_table.py index f2aa597b6..73a881a10 100755 --- a/src/SALOME_SWIG/test_big_table.py +++ b/src/SALOME_SWIG/test_big_table.py @@ -50,7 +50,7 @@ myVerNb = 200 k={} for j in range(0,myHorNb): k[j] = j*10+1 -ARealTable.AddRow(k.values()) +ARealTable.AddRow(list(k.values())) ARealTable.SetRowTitle(1, "Frequency") ARealTable.SetRowUnit(1, "Hz") @@ -60,7 +60,7 @@ for i in range(1,myVerNb+1): k[j] = math.log10(j*30*math.pi/180) * 20 + i * 15 + j*5 else: k[j] = math.sin(j*30*math.pi/180) * 20 + i * 15 + j*5 - ARealTable.AddRow(k.values()) + ARealTable.AddRow(list(k.values())) ARealTable.SetRowTitle(i+1, "Power " + str(i)) ARealTable.SetRowUnit(i+1, "Wt") ARealTable.SetTitle("Very useful data") diff --git a/src/SALOME_SWIG/test_remove_ref.py b/src/SALOME_SWIG/test_remove_ref.py index dafddcd9e..6a4b0b69a 100755 --- a/src/SALOME_SWIG/test_remove_ref.py +++ b/src/SALOME_SWIG/test_remove_ref.py @@ -30,22 +30,22 @@ myBuilder = myStudy.NewBuilder() obj1 = myStudy.FindObjectID("0:1") -if obj1 is None: print "Is null obj1 " -else: print obj1.GetID() +if obj1 is None: print("Is null obj1 ") +else: print(obj1.GetID()) obj2 = myBuilder.NewObject(obj1) -print "Obj2 ID = "+obj2.GetID() +print("Obj2 ID = "+obj2.GetID()) myBuilder.Addreference(obj1, obj2) (f, obj3) = obj1.ReferencedObject() -print "Ref obj ID = "+obj3.GetID() +print("Ref obj ID = "+obj3.GetID()) myBuilder.RemoveReference(obj1) (f, obj4) = obj1.ReferencedObject() -print "Ref is found ", f +print("Ref is found ", f) \ No newline at end of file diff --git a/src/SALOME_SWIG/test_table.py b/src/SALOME_SWIG/test_table.py index e480f6ad8..21b934e9e 100755 --- a/src/SALOME_SWIG/test_table.py +++ b/src/SALOME_SWIG/test_table.py @@ -72,17 +72,17 @@ l={} for j in range(0,20): k[j] = j*10+1 l[j] = "C"+str(j+1) -ARealTable.AddRow(k.values()) +ARealTable.AddRow(list(k.values())) ARealTable.SetRowTitle(1, "Row 0") ARealTable.SetRowUnit(1, "Hz") -ARealTable.SetColumnTitles(l.values()) +ARealTable.SetColumnTitles(list(l.values())) for i in range(1,11): for j in range(1,21): if j % 2 == 1: k[j] = math.log10(j*30*math.pi/180) * 20 + i * 15 + j*5 else: k[j] = math.sin(j*30*math.pi/180) * 20 + i * 15 + j*5 - ARealTable.AddRow(k.values()) + ARealTable.AddRow(list(k.values())) ARealTable.SetRowTitle(i+1, "Row " + str(i)) ARealTable.SetRowUnit(i+1, "Wt") ARealTable.SetTitle("TEST table of real") diff --git a/src/SUITApp/SUITApp_init_python.cxx b/src/SUITApp/SUITApp_init_python.cxx index 372d3e6ed..3724dd562 100644 --- a/src/SUITApp/SUITApp_init_python.cxx +++ b/src/SUITApp/SUITApp_init_python.cxx @@ -17,11 +17,26 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // - +// Author : Roman NIKOLAEV, Open CASCADE S.A.S. (roman.nikolaev@opencascade.com) +// Date : 22/06/2007 +// #include "SUITApp_init_python.hxx" #include -bool SUIT_PYTHON::initialized = false; +#if PY_VERSION_HEX < 0x03050000 +static char* +Py_EncodeLocale(const wchar_t *arg, size_t *size) +{ + return _Py_wchar2char(arg, size); +} +static wchar_t* +Py_DecodeLocale(const char *arg, size_t *size) +{ + return _Py_char2wchar(arg, size); +} +#endif + +bool SUIT_PYTHON::initialized = false; void SUIT_PYTHON::init_python(int argc, char **argv) { @@ -29,9 +44,17 @@ void SUIT_PYTHON::init_python(int argc, char **argv) { return; } - Py_SetProgramName(argv[0]); + + wchar_t **changed_argv = new wchar_t*[argc]; // Setting arguments + for (int i = 0; i < argc; i++) + { + changed_argv[i] = Py_DecodeLocale(argv[i], NULL); + } + + Py_SetProgramName(changed_argv[0]); Py_Initialize(); // Initialize the interpreter - PySys_SetArgv(argc, argv); + + PySys_SetArgv(argc, changed_argv); PyRun_SimpleString("import threading\n"); // VSR (22/09/2016): This is a workaround to prevent invoking qFatal() from PyQt5 // causing application aborting diff --git a/src/SalomeApp/SalomeApp_Application.cxx b/src/SalomeApp/SalomeApp_Application.cxx index 12a733584..70646990f 100644 --- a/src/SalomeApp/SalomeApp_Application.cxx +++ b/src/SalomeApp/SalomeApp_Application.cxx @@ -280,7 +280,7 @@ void SalomeApp_Application::start() script.remove( QRegExp("^python.*[\\s]+") ); QString cmd = script+" "+args; - QString command = QString( "execfile(r\"%1\")" ).arg(cmd.trimmed()); + QString command = QString( "exec(open(\"%1\").read())" ).arg(cmd.trimmed()); pyConsole->exec(command); } } // end for loop on pyfiles QStringList @@ -503,7 +503,7 @@ void SalomeApp_Application::onNewWithScript() { onNewDoc(); - QString command = QString("execfile(r\"%1\")").arg(aFile); + QString command = QString("exec(open(\"%1\").read())").arg(aFile); #ifndef DISABLE_PYCONSOLE PyConsole_Console* pyConsole = pythonConsole(); @@ -934,7 +934,7 @@ void SalomeApp_Application::onLoadScript( ) if ( !aFile.isEmpty() ) { - QString command = QString("execfile(r\"%1\")").arg(aFile); + QString command = QString("exec(open(\"%1\").read())").arg(aFile); #ifndef DISABLE_PYCONSOLE PyConsole_Console* pyConsole = pythonConsole(); @@ -1998,7 +1998,7 @@ bool SalomeApp_Application::onRestoreStudy( const QString& theDumpScript, SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ); // load study from the temporary directory - QString command = QString( "execfile(r\"%1\")" ).arg( theDumpScript ); + QString command = QString( "exec(open(\"%1\").read())" ).arg( theDumpScript ); #ifndef DISABLE_PYCONSOLE PyConsole_Console* pyConsole = app->pythonConsole(); diff --git a/src/SalomeApp/SalomeApp_Study.cxx b/src/SalomeApp/SalomeApp_Study.cxx index 84bb76df6..e44ceb9ae 100644 --- a/src/SalomeApp/SalomeApp_Study.cxx +++ b/src/SalomeApp/SalomeApp_Study.cxx @@ -20,6 +20,10 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +#ifndef DISABLE_PYCONSOLE + #include "SalomeApp_PyInterp.h" // WARNING! This include must be the first! +#endif + #include "SalomeApp_Study.h" #include "SalomeApp_Module.h" @@ -47,10 +51,6 @@ #include -#ifndef DISABLE_PYCONSOLE - #include "SalomeApp_PyInterp.h" // WARNING! This include must be the first! -#endif - #include "utilities.h" #include "SALOMEDS_Tool.hxx" diff --git a/src/SalomeApp/Test/TestSalomeApp.py b/src/SalomeApp/Test/TestSalomeApp.py index 0b25d8042..44ad7ace5 100644 --- a/src/SalomeApp/Test/TestSalomeApp.py +++ b/src/SalomeApp/Test/TestSalomeApp.py @@ -21,7 +21,7 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -import sys, os,signal,string,commands +import sys, os,signal,string,subprocess import runSalome import orbmodule import TestKiller diff --git a/src/SalomeApp/pluginsdemo/salome_plugins.py b/src/SalomeApp/pluginsdemo/salome_plugins.py index c532de866..eaeb93cbb 100755 --- a/src/SalomeApp/pluginsdemo/salome_plugins.py +++ b/src/SalomeApp/pluginsdemo/salome_plugins.py @@ -277,13 +277,13 @@ def runSalomeShellSession(context): elif os.path.exists("/usr/bin/xterm"): command = 'xterm -T "SALOME %s - Shell session" -e "%s/salome shell" &'%(version,kernel_appli_dir) else: - print "Neither xterm nor gnome-terminal nor konsole is installed." + print("Neither xterm nor gnome-terminal nor konsole is installed.") if command is not "": try: subprocess.check_call(command, shell = True) - except Exception, e: - print "Error: ",e + except Exception as e: + print("Error: ",e) salome_pluginsmanager.AddFunction('SALOME shell session', diff --git a/src/SalomeApp/pluginsdemo/tubebuilder.py b/src/SalomeApp/pluginsdemo/tubebuilder.py index 3fcb8c639..cd231842e 100644 --- a/src/SalomeApp/pluginsdemo/tubebuilder.py +++ b/src/SalomeApp/pluginsdemo/tubebuilder.py @@ -32,7 +32,7 @@ def createGeometry(study, radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH, width=DE This function creates the geometry on the specified study and with given parameters. ''' - print "TUBE: creating the geometry ..." + print("TUBE: creating the geometry ...") studyId = study._get_StudyId() geompy = geomtools.getGeompy(studyId) @@ -56,7 +56,7 @@ def createGeometryWithPartition(study, radius=DEFAULT_RADIUS, length=DEFAULT_LEN studyId = study._get_StudyId() geompy = geomtools.getGeompy(studyId) - print "TUBE: creating a partition ..." + print("TUBE: creating a partition ...") toolPlane = geompy.MakeFaceHW(2.1*length,2.1*radius,3) partition = geompy.MakePartition([shape], [toolPlane], [], [], geompy.ShapeType["SOLID"], 0, [], 0) entry = geompy.addToStudy( partition, "TubeWithPartition" ) @@ -64,7 +64,7 @@ def createGeometryWithPartition(study, radius=DEFAULT_RADIUS, length=DEFAULT_LEN def createMesh(study, shape): '''This function creates the mesh of the specified shape on the specified study''' - print "TUBE: creating the mesh ..." + print("TUBE: creating the mesh ...") import SMESH from salome.smesh import smeshBuilder smesh = smeshBuilder.New(study) @@ -104,7 +104,7 @@ def exportModel(mesh, filename): ''' This exports the mesh to the specified filename in the med format ''' - print "TUBE: exporting mesh to file %s ..."%filename + print("TUBE: exporting mesh to file %s ..."%filename) import SMESH mesh.ExportMED(filename, 0, SMESH.MED_V2_2, 1 ) diff --git a/src/SalomeApp/pluginsdemo/tubedialog.py b/src/SalomeApp/pluginsdemo/tubedialog.py index 84f5a418b..3716205b1 100644 --- a/src/SalomeApp/pluginsdemo/tubedialog.py +++ b/src/SalomeApp/pluginsdemo/tubedialog.py @@ -68,7 +68,7 @@ class TubeDialog(TubeDialog_UI): length=eval(str(self.txtLength.text())) width=eval(str(self.txtWidth.text())) except: - print "pb a la saisie" + print("pb a la saisie") return radius, length, width @@ -103,7 +103,7 @@ def TEST_getData_synchrone(): tubedialog.exec_() if tubedialog.wasOk(): radius, length, width = tubedialog.getData() - print radius, length, width + print(radius, length, width) def main( args ): diff --git a/src/SalomeApp/salome_pluginsmanager.py b/src/SalomeApp/salome_pluginsmanager.py index 2eb1ef319..3b5f3d2fa 100644 --- a/src/SalomeApp/salome_pluginsmanager.py +++ b/src/SalomeApp/salome_pluginsmanager.py @@ -103,14 +103,14 @@ plugins={} current_plugins_manager=None def initialize(module,name,basemenuname,menuname): - if not plugins.has_key(name): + if name not in plugins: if module: plugins[name]={} else: plugins[name]=[] if module: d=sgPyQt.getDesktop() - if plugins[name].has_key(d):return + if d in plugins[name]:return plugins[name][d]=PluginsManager(module,name,basemenuname,menuname) else: plugins[name].append(PluginsManager(module,name,basemenuname,menuname)) @@ -149,8 +149,8 @@ logger=Logger("PluginsManager") #,color=GREEN) class PluginsManager: def __init__(self,module,name,basemenuname,menuname): self.name=name - self.basemenuname=unicode(basemenuname, "utf-8") - self.menuname=unicode(menuname, "utf-8") + self.basemenuname=basemenuname + self.menuname=menuname self.module=module self.registry={} self.handlers={} @@ -164,13 +164,16 @@ class PluginsManager: # MODULES plugins are supposed to be located in the # installation folder of the module, in the subdirectory # "share/salome/plugins". We first look for these directories. + searched = [] for key in os.environ.keys(): if key.endswith("_ROOT_DIR"): rootpath=os.environ[key] dirpath=os.path.join(rootpath,PLUGIN_PATH_PATTERN) - if os.path.isdir(dirpath) and dirpath not in self.plugindirs: + if os.path.isdir(dirpath) and dirpath not in self.plugindirs + searched: logger.debug("Looking for plugins in the directory %s ..."%dirpath) walktree(dirpath,self.analyseFile) + if dirpath not in self.plugindirs and dirpath not in searched: + searched.append(dirpath) # USER plugins directory user_dir = os.path.expanduser("~/.config/salome/Plugins") @@ -281,7 +284,7 @@ class PluginsManager: sys.path.insert(0,directory) logger.debug("The directory %s has been added to PYTHONPATH"%directory) try: - execfile(plugins_file,globals(),{}) + exec(compile(open(plugins_file).read(), plugins_file, 'exec'),globals(),{}) except: logger.fatal("Error while loading plugins from file %s"%plugins_file) traceback.print_exc() @@ -305,7 +308,7 @@ class PluginsManager: submenus[str(menu.title())]=menu while len(names) > 1: name=names.pop(0) - if submenus.has_key(name): + if name in submenus: amenu=submenus[name] else: amenu=QMenu(name,parentMenu) diff --git a/src/Session/SALOME_Session_Server.cxx b/src/Session/SALOME_Session_Server.cxx index ea144e9a9..c8465bfd0 100755 --- a/src/Session/SALOME_Session_Server.cxx +++ b/src/Session/SALOME_Session_Server.cxx @@ -25,12 +25,12 @@ // Author : Paul RASCLE, EDF // Module : SALOME +#include #include #include #include #include -#include #include #include diff --git a/tools/CurvePlot/src/python/controller/PlotController.py b/tools/CurvePlot/src/python/controller/PlotController.py index 76be5e6a6..f5670e52e 100644 --- a/tools/CurvePlot/src/python/controller/PlotController.py +++ b/tools/CurvePlot/src/python/controller/PlotController.py @@ -104,13 +104,13 @@ class PlotController(object): if model is None or self._blockNotifications: return - if not self._modelViews.has_key(model): + if model not in self._modelViews: return for view in self._modelViews[model]: method = "on%s" % what if what != "" and what is not None and hasattr(view, method): - exec "view.%s()" % method + exec("view.%s()" % method) elif hasattr(view, "update"): # Generic update: view.update() @@ -268,12 +268,12 @@ class PlotController(object): return -1 ps = control._plotManager.removeXYPlotSet(plot_set_id) - for _, crv in ps._curves.items(): + for _, crv in list(ps._curves.items()): control.removeModelListeners(crv) control.removeModelListeners(ps) psets = control._plotManager._plotSets if len(psets): - control._plotManager.setCurrentPlotSet(psets.keys()[-1]) + control._plotManager.setCurrentPlotSet(list(psets.keys())[-1]) return plot_set_id @classmethod @@ -282,7 +282,7 @@ class PlotController(object): gc.collect() import resource m = resource.getrusage(resource.RUSAGE_SELF)[2]*resource.getpagesize()/1e6 - print "** Used memory: %.2f Mb" % m + print("** Used memory: %.2f Mb" % m) @classmethod def DeleteCurrentItem(cls): @@ -397,7 +397,7 @@ class PlotController(object): """ @return the first plot set whose name matches the provided name. Otherwise returns -1 """ pm = cls.GetInstance()._plotManager - for _, ps in pm._plotSets.items(): + for _, ps in list(pm._plotSets.items()): if ps._title == name: return ps.getID() return -1 @@ -407,10 +407,10 @@ class PlotController(object): """ @return two lists: plot set names, and corresponding plot set IDs """ pm = cls.GetInstance()._plotManager - it = pm._plotSets.items() + it = list(pm._plotSets.items()) ids, inst, titles = [], [], [] if len(it): - ids, inst = zip(*it) + ids, inst = list(zip(*it)) if len(inst): titles = [i.getTitle() for i in inst] return list(ids), titles @@ -477,7 +477,7 @@ class PlotController(object): @return True if plot_set_id is the identifier of a valid and existing plot set. """ control = cls.GetInstance() - return control._plotManager._plotSets.has_key(plot_set_id) + return plot_set_id in control._plotManager._plotSets @classmethod def GetSalomeViewID(cls, plot_set_id): @@ -535,7 +535,7 @@ class PlotController(object): raise ValueError("Invalid marker: '%s'" % marker) cont = cls.GetInstance() - for mod, views in cont._modelViews.items(): + for mod, views in list(cont._modelViews.items()): if isinstance(mod, CurveModel) and mod.getID() == crv_id: for v in views: if isinstance(v, CurveView): @@ -566,11 +566,11 @@ class PlotController(object): from XYView import XYView cont = cls.GetInstance() - for mod, views in cont._modelViews.items(): + for mod, views in list(cont._modelViews.items()): if isinstance(mod, XYPlotSetModel) and mod.getID() == ps_id: for v in views: if isinstance(v, XYView): - exec "v.%s(*args, **kwargs)" % func + exec("v.%s(*args, **kwargs)" % func) found = True if not found: raise Exception("Invalid plot set ID or plot set currently not displayed (ps_id=%d)!" % ps_id) diff --git a/tools/CurvePlot/src/python/controller/__init__.py b/tools/CurvePlot/src/python/controller/__init__.py index fd0b521e3..62d412f2d 100644 --- a/tools/CurvePlot/src/python/controller/__init__.py +++ b/tools/CurvePlot/src/python/controller/__init__.py @@ -10,11 +10,11 @@ try: import matplotlib matplotlib.use('Qt4Agg') import matplotlib.pyplot as plt # must come after the PySide/PyQt4 switch! - plt.rcParams['font.sans-serif'].insert(0, u"DejaVu Sans") + plt.rcParams['font.sans-serif'].insert(0, "DejaVu Sans") except: - print "Warning: could not switch matplotlib to 'Qt4agg' backend. Some characters might be displayed improperly!" + print("Warning: could not switch matplotlib to 'Qt4agg' backend. Some characters might be displayed improperly!") -from PlotController import PlotController +from .PlotController import PlotController from TableModel import TableModel from CurveModel import CurveModel from PlotManager import PlotManager diff --git a/tools/CurvePlot/src/python/model/PlotManager.py b/tools/CurvePlot/src/python/model/PlotManager.py index 665c2a763..b874737e0 100644 --- a/tools/CurvePlot/src/python/model/PlotManager.py +++ b/tools/CurvePlot/src/python/model/PlotManager.py @@ -16,7 +16,7 @@ class PlotManager(Model): return len(self._plotSets) == 0 def setCurrentPlotSet(self, plotSetID, silent=False): - if not self._plotSets.has_key(plotSetID) and plotSetID != -1: + if plotSetID not in self._plotSets and plotSetID != -1: raise ValueError("Invalid plot set ID (%d)!" % plotSetID) self._currentPlotSet = self._plotSets.get(plotSetID, None) if not silent: @@ -26,8 +26,8 @@ class PlotManager(Model): return self._currentPlotSet def getPlotSetContainingCurve(self, curveID): - for ps in self._plotSets.values(): - if ps._curves.has_key(curveID): + for ps in list(self._plotSets.values()): + if curveID in ps._curves: return ps return None @@ -67,8 +67,8 @@ class PlotManager(Model): def removeXYPlotSet(self, plotSetID): Logger.Debug("====> PlotManager::removeXYPlotSet() %d" % plotSetID) - if not self._plotSets.has_key(plotSetID): - print self._plotSets + if plotSetID not in self._plotSets: + print(self._plotSets) raise ValueError("Plot set ID (%d) not found for deletion!" % plotSetID) ps = self._plotSets.pop(plotSetID) if self._currentPlotSet is ps: diff --git a/tools/CurvePlot/src/python/model/XYPlotSetModel.py b/tools/CurvePlot/src/python/model/XYPlotSetModel.py index 18bb60e2f..2edacfb9e 100644 --- a/tools/CurvePlot/src/python/model/XYPlotSetModel.py +++ b/tools/CurvePlot/src/python/model/XYPlotSetModel.py @@ -26,7 +26,7 @@ class XYPlotSetModel(Model): return self._title def setCurrentCurve(self, curveID, silent=False): - if not self._curves.has_key(curveID) and curveID != -1: + if curveID not in self._curves and curveID != -1: raise ValueError("Invalid curve ID (%d)!" % curveID) self._currentCurve = self._curves.get(curveID, None) if not silent: @@ -41,7 +41,7 @@ class XYPlotSetModel(Model): self.notifyChange("AddCurve") def removeCurve(self, curveID, silent=False): - if not self._curves.has_key(curveID): + if curveID not in self._curves: raise ValueError("Curve ID (%d) not found for deletion!" % curveID) c = self._curves.pop(curveID) if self._currentCurve is c: diff --git a/tools/CurvePlot/src/python/pyqtside/__init__.py b/tools/CurvePlot/src/python/pyqtside/__init__.py index ef46e4b6d..1cba014b1 100644 --- a/tools/CurvePlot/src/python/pyqtside/__init__.py +++ b/tools/CurvePlot/src/python/pyqtside/__init__.py @@ -8,12 +8,12 @@ try: raise Exception import PyQt4 _use_pyqt = True - print "Using PyQt4 run-time ..." + print("Using PyQt4 run-time ...") except: try: import PySide _use_pyqt = False - print "Using PySide run-time ..." + print("Using PySide run-time ...") except: raise Exception("Neither PyQt4 nor PySide could be imported!") @@ -24,7 +24,7 @@ try: if _use_pyqt: back = 'PyQt4' else: back = 'PySide' matplotlib.rcParams['backend.qt4'] = back - print "Matplotlib found - Set matplotlib backend to '%s'!" % back + print("Matplotlib found - Set matplotlib backend to '%s'!" % back) except: # No matplotlib, silently discard err message. pass diff --git a/tools/CurvePlot/src/python/pyqtside/uic.py b/tools/CurvePlot/src/python/pyqtside/uic.py index 3f9565b8e..6cc146510 100644 --- a/tools/CurvePlot/src/python/pyqtside/uic.py +++ b/tools/CurvePlot/src/python/pyqtside/uic.py @@ -2,6 +2,6 @@ from . import _use_pyqt if _use_pyqt: from PyQt4.uic import loadUi as loadUiGen else: - from pyside_dynamic import loadUi as loadUiGen + from .pyside_dynamic import loadUi as loadUiGen diff --git a/tools/CurvePlot/src/python/test/PlotCurve_Standalone.py b/tools/CurvePlot/src/python/test/PlotCurve_Standalone.py index ad2886efd..4097dedf0 100755 --- a/tools/CurvePlot/src/python/test/PlotCurve_Standalone.py +++ b/tools/CurvePlot/src/python/test/PlotCurve_Standalone.py @@ -51,7 +51,7 @@ def main(args) : trans = QTranslator() for f in ts_files: if not trans.load(f): - print "could not load translation %s!" % f + print("could not load translation %s!" % f) app.installTranslator(trans) dw = app.desktop() x, y = dw.width()*0.25, dw.height()*0.7 diff --git a/tools/CurvePlot/src/python/test/PlotTestBase.py b/tools/CurvePlot/src/python/test/PlotTestBase.py index 361b0d1e7..e9cfc9aaa 100644 --- a/tools/CurvePlot/src/python/test/PlotTestBase.py +++ b/tools/CurvePlot/src/python/test/PlotTestBase.py @@ -72,7 +72,7 @@ class PlotTestBase(unittest.TestCase): self.tmpBaselineDir = os.path.join(tempfile.gettempdir(), "curveplot_baselines") if not os.path.isdir(self.tmpBaselineDir): os.mkdir(self.tmpBaselineDir) - print "### Rebuilding base lines. Reference files will be saved to '%s'" % self.tmpBaselineDir + print("### Rebuilding base lines. Reference files will be saved to '%s'" % self.tmpBaselineDir) PlotController.WITH_CURVE_BROWSER = True XYView._DEFAULT_LEGEND_STATE = True # always show legend by default @@ -146,7 +146,7 @@ class PlotTestBase(unittest.TestCase): if not ret: # Keep file if assert is false self.keepDir = True - print "[%s] -- Failed screenshot equality, or unable to open baseline file - directory is kept alive: %s" % (self.getTestName(), self.tmpDir) + print("[%s] -- Failed screenshot equality, or unable to open baseline file - directory is kept alive: %s" % (self.getTestName(), self.tmpDir)) return ret def showTabWidget(self): diff --git a/tools/CurvePlot/src/python/test/TestDesktop.py b/tools/CurvePlot/src/python/test/TestDesktop.py index 8d72fd675..142fcf64f 100644 --- a/tools/CurvePlot/src/python/test/TestDesktop.py +++ b/tools/CurvePlot/src/python/test/TestDesktop.py @@ -177,21 +177,21 @@ class TestDesktop(QMainWindow): for _ in range(nC): x, y = self.__generateRandomData(1000) lx.append(x); ly.append(y) - print "Done generating" + print("Done generating") from time import time t0 = time() curveplot.LockRepaint() for i in range(nC): curveplot.AddCurve(lx[i], ly[i], append=True) curveplot.UnlockRepaint() - print "Elapsed: %.2f" % ( time() - t0) + print("Elapsed: %.2f" % ( time() - t0)) def clearPlotSet(self): curveplot.ClearPlotSet() def addPS(self): # Also a test for unicode! - curveplot.AddPlotSet(u'ça m embête') + curveplot.AddPlotSet('ça m embête') def addTab(self): pass @@ -216,12 +216,12 @@ class TestDesktop(QMainWindow): @Slot() def memPrint(self): i, t = curveplot.GetAllPlotSets() - print zip(i, t) + print(list(zip(i, t))) new_id = curveplot.CopyCurve(curve_id=0, plot_set_id=1) - print "created curve: %d" % new_id + print("created curve: %d" % new_id) import resource m = resource.getrusage(resource.RUSAGE_SELF)[2]*resource.getpagesize()/1e6 - print "** Used memory: %.2f Mb" % m + print("** Used memory: %.2f Mb" % m) if self.cnt >= 0 and self.cnt < self.MAX_CNT: self.cnt += 1 QTimer.singleShot(self.timeLap, self, SLOT("curveSameFig()")) diff --git a/tools/CurvePlot/src/python/test/plot_test.py b/tools/CurvePlot/src/python/test/plot_test.py index 204406cd4..3058925ff 100644 --- a/tools/CurvePlot/src/python/test/plot_test.py +++ b/tools/CurvePlot/src/python/test/plot_test.py @@ -148,7 +148,7 @@ class PlotTest(PlotTestBase): def testAddCurve(self): x, y = self.generateSine() tw = self.showTabWidget() - PlotController.AddCurve(x, y, curve_label="My curve", x_label=u"Lèés X (unicode!)", y_label=u"Et des ŷ", append=False) + PlotController.AddCurve(x, y, curve_label="My curve", x_label="Lèés X (unicode!)", y_label="Et des ŷ", append=False) self.assertTrue(self.areScreenshotEqual(tw)) def testAddCurveAppend(self): @@ -304,21 +304,21 @@ class PlotTest(PlotTestBase): def testSetLabelX(self): tw = self.showTabWidget() ps_id = PlotController.AddPlotSet("My plotset") - PlotController.SetXLabel(u"The X-s éà", ps_id) + PlotController.SetXLabel("The X-s éà", ps_id) self.assertTrue(self.areScreenshotEqual(tw)) def testSetLabelY(self): tw = self.showTabWidget() ps_id = PlotController.AddPlotSet("My plotset") - PlotController.SetYLabel(u"Tutu", ps_id) - PlotController.SetYLabel(u"The Y-s uûàç", ps_id) + PlotController.SetYLabel("Tutu", ps_id) + PlotController.SetYLabel("The Y-s uûàç", ps_id) self.assertTrue(self.areScreenshotEqual(tw)) def testSetPlotSetTitle(self): tw = self.showTabWidget() ps_id = PlotController.AddPlotSet("tutu") PlotController.AddPlotSet("tata") - PlotController.SetPlotSetTitle(u"un titre àé", ps_id) + PlotController.SetPlotSetTitle("un titre àé", ps_id) PlotController.SetCurrentPlotSet(ps_id) self.assertTrue(self.areScreenshotEqual(tw)) @@ -354,7 +354,7 @@ class PlotTest(PlotTestBase): dlg_test.showLegendCheckBox.setChecked(True) return True dlg_test.exec_ = fun - t = PlotController.GetInstance()._curveTabsView._XYViews.items() + t = list(PlotController.GetInstance()._curveTabsView._XYViews.items()) t[0][1].onSettings(dlg_test=dlg_test) self.assertTrue(self.areScreenshotEqual(tw)) @@ -389,7 +389,7 @@ class PlotTest(PlotTestBase): dlg_test.showLegendCheckBox.setChecked(True) return True dlg_test.exec_ = fun - t = PlotController.GetInstance()._curveTabsView._XYViews.items() + t = list(PlotController.GetInstance()._curveTabsView._XYViews.items()) t[0][1].onSettings(dlg_test=dlg_test) self.assertTrue(self.areScreenshotEqual(tw)) diff --git a/tools/CurvePlot/src/python/ui/PlotSettings.py b/tools/CurvePlot/src/python/ui/PlotSettings.py index bd6aac256..d26461895 100644 --- a/tools/CurvePlot/src/python/ui/PlotSettings.py +++ b/tools/CurvePlot/src/python/ui/PlotSettings.py @@ -53,10 +53,10 @@ class PlotSettings(QtGui.QDialog): return pix def accept(self): - xminText = unicode(self.axisXMinEdit.text()) - xmaxText = unicode(self.axisXMaxEdit.text()) - yminText = unicode(self.axisYMinEdit.text()) - ymaxText = unicode(self.axisYMaxEdit.text()) + xminText = str(self.axisXMinEdit.text()) + xmaxText = str(self.axisXMaxEdit.text()) + yminText = str(self.axisYMinEdit.text()) + ymaxText = str(self.axisYMaxEdit.text()) if (yminText == "" or ymaxText == "") : QtGui.QMessageBox.critical(self, "Plot settings", "A field \"YMin\" or \"YMax\" is empty") else : diff --git a/tools/CurvePlot/src/python/views/CurveBrowserView.py b/tools/CurvePlot/src/python/views/CurveBrowserView.py index ad2facd56..df296b60a 100644 --- a/tools/CurvePlot/src/python/views/CurveBrowserView.py +++ b/tools/CurvePlot/src/python/views/CurveBrowserView.py @@ -35,11 +35,11 @@ class CurveBrowserView( View, CurveTreeDockWidget) : plotSets = self._model._plotSets # The second (hidden) column in the tree bares the ID of the object and its nature (plotset or curve) - for p in plotSets.values(): - item = QtGui.QTreeWidgetItem([unicode(p.getTitle()), unicode(p.getID()) + '_set']) + for p in list(plotSets.values()): + item = QtGui.QTreeWidgetItem([str(p.getTitle()), str(p.getID()) + '_set']) treeWidget.addTopLevelItem(item) - for c in p._curves.values(): - chld = QtGui.QTreeWidgetItem([unicode(c.getTitle()), unicode(c.getID()) + '_crv']) + for c in list(p._curves.values()): + chld = QtGui.QTreeWidgetItem([str(c.getTitle()), str(c.getID()) + '_crv']) item.addChild(chld) treeWidget.expandAll() diff --git a/tools/CurvePlot/src/python/views/CurveTabsView.py b/tools/CurvePlot/src/python/views/CurveTabsView.py index 3454837c6..9189239f9 100644 --- a/tools/CurvePlot/src/python/views/CurveTabsView.py +++ b/tools/CurvePlot/src/python/views/CurveTabsView.py @@ -32,7 +32,7 @@ class CurveTabsView(View): def mapModId2ViewId(self): """ Gives a map from model ID (the model behind the XYView) to view ID """ - lst = [(v._model.getID(), view_id) for view_id, v in self._XYViews.items()] + lst = [(v._model.getID(), view_id) for view_id, v in list(self._XYViews.items())] return dict(lst) def update(self): @@ -44,7 +44,7 @@ class CurveTabsView(View): # Check list of tabs: set_mod = set(self._model._plotSets.keys()) - set_view = set([ v._model.getID() for v in self._XYViews.values() ]) + set_view = { v._model.getID() for v in list(self._XYViews.values()) } mp = self.mapModId2ViewId() # Deleted/Added curves: @@ -62,7 +62,7 @@ class CurveTabsView(View): newViews.append(self.createXYView(self._model._plotSets[a])) # Now update all tabs individually (this will trigger creation of new ones if not already there): - for v in self._XYViews.values() + newViews: + for v in list(self._XYViews.values()) + newViews: # The update on newViews will trigger the SALOME view creation: v.update() diff --git a/tools/CurvePlot/src/python/views/XYView.py b/tools/CurvePlot/src/python/views/XYView.py index 42ad149ec..ba3ca5731 100644 --- a/tools/CurvePlot/src/python/views/XYView.py +++ b/tools/CurvePlot/src/python/views/XYView.py @@ -158,7 +158,7 @@ class XYView(View): if event.mouseevent.button == 1: selected_id = -1 a = event.artist - for crv_id, cv in self._curveViews.items(): + for crv_id, cv in list(self._curveViews.items()): if cv._mplLines[0] is a: selected_id = crv_id # Use the plotmanager so that other plot sets get their current reset: @@ -301,10 +301,10 @@ class XYView(View): return action = self._curveActionGroup.checkedAction() if action is self._pointsAction : - for crv_view in self._curveViews.values(): + for crv_view in list(self._curveViews.values()): crv_view.setLineStyle("None") elif action is self._linesAction : - for crv_view in self._curveViews.values(): + for crv_view in list(self._curveViews.values()): crv_view.setLineStyle("-") else : raise NotImplementedError @@ -682,7 +682,7 @@ class XYView(View): point = event.canvas.mapToGlobal(QtCore.QPoint(event.x,canvasSize.height()-event.y)) self._popupMenu.exec_(point) else : - print "Press event on the other button" + print("Press event on the other button") #if event.button == 3 : # canvasSize = event.canvas.geometry() # point = event.canvas.mapToGlobal(QtCore.QPoint(event.x,canvasSize.height()-event.y)) @@ -690,13 +690,13 @@ class XYView(View): # self._popupMenu.show() def onMotionEvent(self, event): - print "OnMotionEvent ",event.button + print("OnMotionEvent ",event.button) #if event.button == 3 : # event.button = None # return True def onReleaseEvent(self, event): - print "OnReleaseEvent ",event.button + print("OnReleaseEvent ",event.button) #if event.button == 3 : # event.button = None # return False diff --git a/tools/PyConsole/src/PyConsole_Console.cxx b/tools/PyConsole/src/PyConsole_Console.cxx index 26f8b1cdc..6a38b7c5c 100644 --- a/tools/PyConsole/src/PyConsole_Console.cxx +++ b/tools/PyConsole/src/PyConsole_Console.cxx @@ -22,8 +22,8 @@ // File : PyConsole_Console.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -#include "PyConsole_Console.h" #include "PyConsole_Interp.h" +#include "PyConsole_Console.h" #include "PyConsole_Editor.h" #include diff --git a/tools/PyConsole/src/PyConsole_Editor.cxx b/tools/PyConsole/src/PyConsole_Editor.cxx index 4c3df75f0..d0b03e59f 100644 --- a/tools/PyConsole/src/PyConsole_Editor.cxx +++ b/tools/PyConsole/src/PyConsole_Editor.cxx @@ -88,8 +88,8 @@ - : undoes auto-completion */ -#include "PyConsole_Editor.h" #include "PyConsole_Interp.h" +#include "PyConsole_Editor.h" #include "PyConsole_Event.h" #include "PyInterp_Dispatcher.h" #include "PyConsole_Request.h" diff --git a/tools/PyConsole/src/PyConsole_Interp.cxx b/tools/PyConsole/src/PyConsole_Interp.cxx index 722413686..03948e1bf 100644 --- a/tools/PyConsole/src/PyConsole_Interp.cxx +++ b/tools/PyConsole/src/PyConsole_Interp.cxx @@ -131,13 +131,13 @@ bool PyConsole_Interp::runDirCommand( const QString& dirArgument, const QString& cmd.prepend( QString( "%1." ).arg( dirArgument ) ); PyObject* str = PyRun_String( cmd.toStdString().c_str(), Py_eval_input, _global_context, _local_context ); - if ( !str || str == Py_None || !PyString_Check( str ) ) + if ( !str || str == Py_None || !PyUnicode_Check( str ) ) { if ( !str ) PyErr_Clear(); } else { - docString = QString( PyString_AsString( str ) ); + docString = QString( PyUnicode_AsUTF8( str ) ); } Py_XDECREF( str ); } @@ -183,7 +183,7 @@ bool PyConsole_Interp::runDirAndExtract( const QString& dirArgument, for ( int i = 0; i < n; i++ ) { PyObject* it; it = PySequence_GetItem( plst, i ); - QString s( PyString_AsString( it ) ); + QString s( PyUnicode_AsUTF8( it ) ); // if the method is not from swig, not static (guessed from the reg exp) and matches // what is already there if ( s.startsWith( startMatch ) ) { diff --git a/tools/PyConsole/src/PyConsole_Interp.h b/tools/PyConsole/src/PyConsole_Interp.h index 434b73cd4..543b8c960 100644 --- a/tools/PyConsole/src/PyConsole_Interp.h +++ b/tools/PyConsole/src/PyConsole_Interp.h @@ -25,8 +25,8 @@ #ifndef PYCONSOLE_INTERP_H #define PYCONSOLE_INTERP_H -#include "PyConsole.h" #include "PyInterp_Interp.h" +#include "PyConsole.h" #include diff --git a/tools/PyInterp/src/PyInterp_Interp.cxx b/tools/PyInterp/src/PyInterp_Interp.cxx index 200649073..1caeece65 100644 --- a/tools/PyInterp/src/PyInterp_Interp.cxx +++ b/tools/PyInterp/src/PyInterp_Interp.cxx @@ -26,7 +26,7 @@ #include "PyInterp_Utils.h" #include -#include +//#include #include #include #include @@ -93,8 +93,8 @@ static PyMemberDef PyStdOut_memberlist[] = { static PyTypeObject PyStdOut_Type = { /* The ob_type field must be initialized in the module init function * to be portable to Windows without using C++. */ - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT(NULL, 0) + /*0,*/ /*ob_size*/ "PyOut", /*tp_name*/ sizeof(PyStdOut), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -242,9 +242,16 @@ void PyInterp_Interp::initPython() { if (!Py_IsInitialized()){ // Python is not initialized - Py_SetProgramName(_argv[0]); + wchar_t **changed_argv = new wchar_t*[_argc]; // Setting arguments + size_t mbslen; + for (int i = 0; i < _argc; i++) + { + changed_argv[i] = Py_DecodeLocale(_argv[i], NULL); + } + + Py_SetProgramName(changed_argv[0]); Py_Initialize(); // Initialize the interpreter - PySys_SetArgv(_argc, _argv); + PySys_SetArgv(_argc, changed_argv); PyEval_InitThreads(); // Create (and acquire) the Python global interpreter lock (GIL) PyEval_SaveThread(); // release safely GIL @@ -342,7 +349,7 @@ static int run_command(const char *command, PyObject * global_ctxt, PyObject * l return 1; } else { - PyObjWrapper r(PyEval_EvalCode((PyCodeObject *)(void *)v,global_ctxt, local_ctxt)); + PyObjWrapper r(PyEval_EvalCode((PyObject *)(void *)v,global_ctxt, local_ctxt)); if(!r) { // Execution error. We return -1 PyErr_Print(); diff --git a/tools/PyInterp/src/PyInterp_Utils.h b/tools/PyInterp/src/PyInterp_Utils.h index d47ff1846..7ad22d962 100644 --- a/tools/PyInterp/src/PyInterp_Utils.h +++ b/tools/PyInterp/src/PyInterp_Utils.h @@ -31,6 +31,19 @@ #include #endif +#if PY_VERSION_HEX < 0x03050000 +static char* +Py_EncodeLocale(const wchar_t *arg, size_t *size) +{ + return _Py_wchar2char(arg, size); +} +static wchar_t* +Py_DecodeLocale(const char *arg, size_t *size) +{ + return _Py_char2wchar(arg, size); +} +#endif + /** * \class PyLockWrapper * \brief Python GIL wrapper. diff --git a/tools/dlgfactory/dlgfactory.py b/tools/dlgfactory/dlgfactory.py index 1fe6e8b21..96b8dc4bf 100755 --- a/tools/dlgfactory/dlgfactory.py +++ b/tools/dlgfactory/dlgfactory.py @@ -113,12 +113,12 @@ if __name__ == "__main__": for line in finput: line = line[:-1] line = line.replace( "__CLASSNAME__", className ) - print line + print(line) pass if options.verbose: - print "Note that the following directives should be present in your CMakeLists.txt (or something like that): \n" - print __msg_str.replace( "__CLASSNAME__", className ) + print("Note that the following directives should be present in your CMakeLists.txt (or something like that): \n") + print((__msg_str.replace( "__CLASSNAME__", className ))) pass pass