Browse Source

Provide mechanism to set PythonQt initialization flags.

* Note that by default PythonQt::IgnoreSiteModule and  PythonQt::RedirectStdOut
are set.
Jean-Christophe Fillion-Robin 13 years ago
parent
commit
dde2498274

+ 24 - 0
Libs/Scripting/Python/Core/Testing/Cpp/ctkAbstractPythonManagerTest.cpp

@@ -21,6 +21,8 @@ private Q_SLOTS:
 
   void testIsPythonInitialized();
 
+  void testSetInitializationFlags();
+
   void testPythonErrorOccured();
   void testPythonErrorOccured_data();
 
@@ -46,6 +48,28 @@ void ctkAbstractPythonManagerTester::testIsPythonInitialized()
 }
 
 // ----------------------------------------------------------------------------
+void ctkAbstractPythonManagerTester::testSetInitializationFlags()
+{
+  QCOMPARE(this->PythonManager.initializationFlags(), PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut);
+
+  int flagsToSetPreInit = PythonQt::RedirectStdOut;
+  int expectedFlagsPreInit = PythonQt::RedirectStdOut;
+
+  this->PythonManager.setInitializationFlags(flagsToSetPreInit);
+  QCOMPARE(this->PythonManager.initializationFlags(), expectedFlagsPreInit);
+
+  this->PythonManager.mainContext();
+
+  int flagsToSetPostInit = 0;
+  int expectedFlagsPostInit = PythonQt::RedirectStdOut;
+
+  this->PythonManager.setInitializationFlags(flagsToSetPostInit);
+  QCOMPARE(this->PythonManager.initializationFlags(), expectedFlagsPostInit);
+
+  QCOMPARE(this->PythonManager.isPythonInitialized(), true);
+}
+
+// ----------------------------------------------------------------------------
 void ctkAbstractPythonManagerTester::testMainContext()
 {
   QVERIFY(this->PythonManager.mainContext());

+ 25 - 5
Libs/Scripting/Python/Core/ctkAbstractPythonManager.cpp

@@ -51,6 +51,8 @@ public:
   virtual ~ctkAbstractPythonManagerPrivate();
 
   void (*InitFunction)();
+
+  int PythonQtInitializationFlags;
 };
 
 //-----------------------------------------------------------------------------
@@ -61,6 +63,7 @@ ctkAbstractPythonManagerPrivate::ctkAbstractPythonManagerPrivate(ctkAbstractPyth
   q_ptr(&object)
 {
   this->InitFunction = 0;
+  this->PythonQtInitializationFlags = PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut;
 }
 
 //-----------------------------------------------------------------------------
@@ -88,11 +91,30 @@ ctkAbstractPythonManager::~ctkAbstractPythonManager()
 }
 
 //-----------------------------------------------------------------------------
+void ctkAbstractPythonManager::setInitializationFlags(int flags)
+{
+  Q_D(ctkAbstractPythonManager);
+  if (PythonQt::self())
+    {
+    return;
+    }
+  d->PythonQtInitializationFlags = flags;
+}
+
+//-----------------------------------------------------------------------------
+int ctkAbstractPythonManager::initializationFlags()const
+{
+  Q_D(const ctkAbstractPythonManager);
+  return d->PythonQtInitializationFlags;
+}
+
+//-----------------------------------------------------------------------------
 PythonQtObjectPtr ctkAbstractPythonManager::mainContext()
 {
+  Q_D(ctkAbstractPythonManager);
   if (!PythonQt::self())
     {
-    this->initPythonQt();
+    this->initPythonQt(d->PythonQtInitializationFlags);
     }
   if (PythonQt::self())
     {
@@ -102,11 +124,11 @@ PythonQtObjectPtr ctkAbstractPythonManager::mainContext()
 }
 
 //-----------------------------------------------------------------------------
-void ctkAbstractPythonManager::initPythonQt()
+void ctkAbstractPythonManager::initPythonQt(int flags)
 {
   Q_D(ctkAbstractPythonManager);
 
-  PythonQt::init(PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut);
+  PythonQt::init(flags);
 
   // Python maps SIGINT (control-c) to its own handler.  We will remap it
   // to the default so that control-c works.
@@ -132,8 +154,6 @@ void ctkAbstractPythonManager::initPythonQt()
     initCode << QString("sys.path.append('%1')").arg(QDir::fromNativeSeparators(path));
     }
 
-  initCode << QString("import site");
-
   _mainContext.evalScript(initCode.join("\n"));
 
   this->preInitialization();

+ 10 - 1
Libs/Scripting/Python/Core/ctkAbstractPythonManager.h

@@ -42,6 +42,15 @@ public:
   ctkAbstractPythonManager(QObject* _parent=NULL);
   virtual ~ctkAbstractPythonManager();
 
+  /// Calling this function after mainContext() has been called at least once is a no-op.
+  /// If not overridden calling this function, the default initialization flags are
+  /// PythonQt::IgnoreSiteModule and PythonQt::RedirectStdOut.
+  /// \sa PythonQt::InitFlags
+  void setInitializationFlags(int flags);
+
+  /// \sa setInitializationFlags
+  int initializationFlags()const;
+
   PythonQtObjectPtr mainContext();
   void addObjectToPythonMain(const QString& name, QObject* obj);
   void registerPythonQtDecorator(QObject* decorator);
@@ -108,7 +117,7 @@ protected Q_SLOTS:
 
 protected:
 
-  void initPythonQt();
+  void initPythonQt(int flags);
 
   virtual QStringList     pythonPaths();