Dear Peter,

I've just entered the issue into your bug tracking system. Here is the
exerpt from the issue text:

My environment:
Windows 7 64bit ; VS 2017 Professional, Qt 5.12.3, Python 3.5.2 (Anaconda
4.2.0 bundle)

Short  technical description of the problem:
 The reason for the crash lies in the fact that the first attempt to use
the mitk::PythonService happens within the mitk::PythonService()
constructor (within mitk::PythonActivator::Load() method) as part of Python
static initialization and BEFORE the service gets registed thorugh the
m_PythonServiceRegistration =
context->RegisterService<mitk::IPythonService>(m_PythonService.GetPointer(),
_PythonServiceProps); call within the same
mitk::PythonActivator::Load()    method.

Short technical description of the fix:
The idea of the fix is to defer the first query for the PythonService until
 the service is register by moving all python initialization related  the
mitk::PythonService() constructor functionality into new separate
Initialize() method (also defining it within the IPythonService abstrct
class) and calling this Initialize() method within the mitk::
QmitkPythonVariableStackTableModel() constructor.
Debugging the modified code has shown that now the first PythonService
query indeed happens after it was actually registered which resolved the
problem.

 I am also attaching the diff file (PythoPluginDiff.txt) of all
modifications I've made to resolve the issue which can be used as a patch
(did not find how I can attach it to the bug report)

Regarding my second question (fixing the colors for Dark Theme), I am
attaching the second diff file ()containing modification to
QmitkCtkPythonShell() constructor which made the Python console text pretty
readable.


On Wed, Jun 19, 2019 at 6:09 AM Neher, Peter <p.ne...@dkfz-heidelberg.de>
wrote:

> Dear Alex,
>
>
>
> If I recall correctly, this feature worked for me when I last tried it a
> couple of weeks ago. Maybe it’s a Qt issue. Which Qt version are you using?
> Also could you enter this issue in our bug tracking system including your
> quick fix? https://phabricator.mitk.org/
>
>
>
> I am currently out of office, but I can take a look at it when I am back.
>
>
>
> Cheers,
>
> Peter
>
>
>
> *Von:* Alex Lisovich <alex.lisov...@gmail.com>
> *Gesendet:* Dienstag, 18. Juni 2019 00:44
> *An:* mitk-users@lists.sourceforge.net
> *Betreff:* Re: [mitk-users] org.mitk.gui.qt.python plugin fails to run on
> Windows
>
>
>
> Dear All,
>
>
>
> Sorry for a long post, but here it goes:
>
>
>
> For the last few days I was trying to compile/run
> the org.mitk.gui.qt.python Python pligin.
>
> Basically, it compiles just fine, but when trying to load (both in Release
> and Debug mode) it generates (and displays instead of Python console) the
> following message: "Part Initialization Error: Default constructed
> ServiceReference is not valid input to GetService()".
>
>
>
> Running it in Debug mode revealed that this is the result of throwing the
> exception within the ModuleContext::GetService(const ServiceReferenceBase&
> reference) as a result of PythonService not being registered at the moment
> of call which in turn happens within the mitk::PythonActivator::Load()
> during the call to PythonService constructor and BEFORE the PythonService
> is actually get registered.
>
>
>
> Further digging in MITK forum archives, I came along the thread  *[mitk-users]
> Can't run Python plugin
> <https://sourceforge.net/p/mitk/mailman/message/34810888/>  *initiated by
> Matt Clarkson  describing exactly the same problem and dated back to 2016.
> During the discussion, Miklos Espak provided the explanation for this
> phenomenon (bug in PythonQT related to static variables initialization) and
> outlined 3 ways to fix the problem, second of them being moving all
> PythonQT initialization related code from the static initialization.
>
>
>
> Using his second suggestion I was able to successfully implement "quick
> and dirty" fix allowing to plugin load and run just fine (including
> SimpleITK import, images drag and drop, simple processing etc).
>
>
>
> So after all this hassle, I basically have two questions:
>
>
>
> (1) It looks the Python plugin has been broken on Windows since 2016 and
> likely since MITK 2015 release (that's what Miklos is saying in thread
> above). Was anybody able to successfully run it on Windows since then, and
> if yes, was it fixed somehow outside of the master branch or I am missing
> something?
>
>
>
> (2) The Python Console window text colors are such that it is practically
> impossible to see anything you type (in "Light" theme it is fine). Does
> anybody know if there is some qml (or xml) file with default colors I can
> modify (the colorare defined as Q_PROPERTY's within the code)?
>
>
>
>
> P.S. I am running Windows 7 64 bit, the MITK was configured using CMake
> 3.14.3 and compiled on VS 2017 Professional.
>
>
>
>
>
> Best Regards, and sorry again for a supre-long post,
>
>
>
> Alex
>
>
>
>
>
>
>
>
>
 
diff --git a/Modules/QtPython/QmitkCtkPythonShell.cpp 
b/Modules/QtPython/QmitkCtkPythonShell.cpp
index 576b817..07b326c 100644
--- a/Modules/QtPython/QmitkCtkPythonShell.cpp
+++ b/Modules/QtPython/QmitkCtkPythonShell.cpp
@@ -35,6 +35,15 @@ struct QmitkCtkPythonShellData
 QmitkCtkPythonShell::QmitkCtkPythonShell(QWidget* parent)
     : ctkPythonConsole(parent), d( new QmitkCtkPythonShellData )
 {
+  QFont font=this->shellFont();
+  
+  font.setPixelSize(font.pixelSize()-1);
+  this->setShellFont(font);
+
+  this->setPromptColor(Qt::darkCyan);
+  this->setCommandTextColor(Qt::magenta);
+
+
   MITK_DEBUG("QmitkCtkPythonShell") << "retrieving  IPythonService";
   us::ModuleContext* context = us::GetModuleContext();
   d->m_PythonServiceRef = context->GetServiceReference<mitk::IPythonService>();
   
 Modules/Python/mitkIPythonService.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Modules/Python/mitkIPythonService.h 
b/Modules/Python/mitkIPythonService.h
index 935c8cd..3fda30d 100644
--- a/Modules/Python/mitkIPythonService.h
+++ b/Modules/Python/mitkIPythonService.h
@@ -149,6 +149,8 @@ namespace mitk
         virtual void AddRelativeSearchDirs(std::vector< std::string > dirs) = 
0;
 
         virtual void AddAbsoluteSearchDirs(std::vector< std::string > dirs) = 
0;
+
+               virtual void Initialize() = 0;
     };
 }
 
 Modules/Python/autoload/PythonService/mitkPythonService.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Modules/Python/autoload/PythonService/mitkPythonService.h 
b/Modules/Python/autoload/PythonService/mitkPythonService.h
index 3b99edb..9430be9 100644
--- a/Modules/Python/autoload/PythonService/mitkPythonService.h
+++ b/Modules/Python/autoload/PythonService/mitkPythonService.h
@@ -33,6 +33,9 @@ namespace mitk
       /// instantiate python manager here
       PythonService();
       ///
+         /// initialize service here
+         void Initialize();
+         ///
       /// empty implementation...
       ~PythonService();
       ///

            Modules/QtPython/QmitkPythonVariableStackTableModel.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Modules/QtPython/QmitkPythonVariableStackTableModel.cpp 
b/Modules/QtPython/QmitkPythonVariableStackTableModel.cpp
index 04c810e..36c9bbe 100644
--- a/Modules/QtPython/QmitkPythonVariableStackTableModel.cpp
+++ b/Modules/QtPython/QmitkPythonVariableStackTableModel.cpp
@@ -33,6 +33,7 @@ 
QmitkPythonVariableStackTableModel::QmitkPythonVariableStackTableModel(QObject *
     m_PythonServiceRef = context->GetServiceReference<mitk::IPythonService>();
     m_PythonService = 
context->GetService<mitk::IPythonService>(m_PythonServiceRef);
     m_PythonService->AddPythonCommandObserver( this );
+    m_PythonService->Initialize();
 }
 
 QmitkPythonVariableStackTableModel::~QmitkPythonVariableStackTableModel()

 .../autoload/PythonService/mitkPythonService.cpp   | 51 +++++++++++++---------
 1 file changed, 30 insertions(+), 21 deletions(-)

diff --git a/Modules/Python/autoload/PythonService/mitkPythonService.cpp 
b/Modules/Python/autoload/PythonService/mitkPythonService.cpp
index 367e07f..2b94037 100644
--- a/Modules/Python/autoload/PythonService/mitkPythonService.cpp
+++ b/Modules/Python/autoload/PythonService/mitkPythonService.cpp
@@ -41,22 +41,23 @@ See LICENSE.txt or http://www.mitk.org for details.
 typedef itksys::SystemTools ist;
 
 mitk::PythonService::PythonService()
-  : m_ItkWrappingAvailable( true )
-  , m_OpenCVWrappingAvailable( true )
-  , m_VtkWrappingAvailable( true )
-  , m_ErrorOccured( false )
+  : m_ItkWrappingAvailable(true), m_OpenCVWrappingAvailable(true), 
m_VtkWrappingAvailable(true), m_ErrorOccured(false)
 {
-  bool pythonInitialized = static_cast<bool>( Py_IsInitialized() ); 
//m_PythonManager.isPythonInitialized() );
+}
+
+void mitk::PythonService::Initialize()
+{
+  bool pythonInitialized = static_cast<bool>(Py_IsInitialized()); // 
m_PythonManager.isPythonInitialized() );
 
   // due to strange static var behaviour on windows Py_IsInitialized() returns 
correct value while
   // m_PythonManager.isPythonInitialized() does not because it has been 
constructed and destructed again
-  if( !pythonInitialized )
+  if (!pythonInitialized)
   {
     MITK_INFO << "Initializing python service";
-    //TODO a better way to do this
+    // TODO a better way to do this
 #ifndef WIN32
     dlerror();
-    if(dlopen(PYTHON_LIBRARY, RTLD_NOW | RTLD_GLOBAL) == nullptr )
+    if (dlopen(PYTHON_LIBRARY, RTLD_NOW | RTLD_GLOBAL) == nullptr)
     {
       mitkThrow() << "Python runtime could not be loaded: " << dlerror();
     }
@@ -65,26 +66,34 @@ mitk::PythonService::PythonService()
     std::string programPath = 
QCoreApplication::applicationDirPath().toStdString() + "/";
 
     QString pythonCommand;
-    pythonCommand.append( QString("import site, sys\n") );
-    pythonCommand.append( QString("import SimpleITK as sitk\n") );
-    pythonCommand.append( QString("import SimpleITK._SimpleITK as 
_SimpleITK\n") );
-    pythonCommand.append( QString("import numpy\n") );
-
-    pythonCommand.append( QString("sys.path.append('')\n") );
-    pythonCommand.append( 
QString("sys.path.append('%1')\n").arg(programPath.c_str()) );
-    pythonCommand.append( 
QString("sys.path.append('%1')\n").arg(EXTERNAL_DIST_PACKAGES) );
-    pythonCommand.append( 
QString("\nsite.addsitedir('%1')").arg(EXTERNAL_SITE_PACKAGES) );
-
-    if( pythonInitialized )
-      
m_PythonManager.setInitializationFlags(PythonQt::RedirectStdOut|PythonQt::PythonAlreadyInitialized);
+
+    pythonCommand.append(QString("import site, sys\n"));
+    pythonCommand.append(QString("import SimpleITK as sitk\n"));
+    pythonCommand.append(QString("import SimpleITK._SimpleITK as 
_SimpleITK\n"));
+    pythonCommand.append(QString("import numpy\n"));
+    pythonCommand.append(QString("import vtk\n"));
+    
pythonCommand.append(QString("sys.path.append('%1')\n").arg(programPath.c_str()));
+
+    /*
+    // was in original constructor as part of setup
+    // commented out because the variables EXTERNAL_DIST_PACKAGES and 
EXTERNAL_SITE_PACKAGES
+    // are valid only for computer on which MITK was built
+      
pythonCommand.append(QString("sys.path.append('%1')\n").arg(EXTERNAL_DIST_PACKAGES));
+      
pythonCommand.append(QString("\nsite.addsitedir('%1')").arg(EXTERNAL_SITE_PACKAGES));
+    */
+
+    if (pythonInitialized)
+      m_PythonManager.setInitializationFlags(PythonQt::RedirectStdOut | 
PythonQt::PythonAlreadyInitialized);
     else
       m_PythonManager.setInitializationFlags(PythonQt::RedirectStdOut);
+
     m_PythonManager.initialize();
 
-    m_PythonManager.executeString( pythonCommand, 
ctkAbstractPythonManager::FileInput );
+    m_PythonManager.executeString(pythonCommand, 
ctkAbstractPythonManager::FileInput);
   }
 }
 
+
 mitk::PythonService::~PythonService()
 {
   MITK_DEBUG("mitk::PythonService") << "destructing PythonService";

_______________________________________________
mitk-users mailing list
mitk-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mitk-users

Reply via email to