void QgsPythonUtilsImpl::initServerPython( QgsServerInterface* interface ) { init(); if ( !checkSystemImports() ) { exitPython(); return; } // This is the main difference with initInterface() for desktop plugins // import QGIS Server bindings QString error_msg = QObject::tr( "Couldn't load PyQGIS Server." ) + '\n' + QObject::tr( "Python support will be disabled." ); if ( !runString( "from qgis.server import *", error_msg ) ) { return; } // This is the other main difference with initInterface() for desktop plugins runString( "qgis.utils.initServerInterface(" + QString::number(( unsigned long ) interface ) + ')' ); finish(); }
QgsPythonUtilsImpl::~QgsPythonUtilsImpl() { #if SIP_VERSION >= 0x40e06 exitPython(); #endif }
void QgsPythonUtilsImpl::initPython( QgisInterface* interface ) { // initialize python Py_Initialize(); // initialize threading AND acquire GIL PyEval_InitThreads(); mPythonEnabled = true; mMainModule = PyImport_AddModule( "__main__" ); // borrowed reference mMainDict = PyModule_GetDict( mMainModule ); // borrowed reference runString( "import sys" ); // import sys module (for display / exception hooks) runString( "import os" ); // import os module (for user paths) // support for PYTHONSTARTUP-like environment variable: PYQGIS_STARTUP // (unlike PYTHONHOME and PYTHONPATH, PYTHONSTARTUP is not supported for embedded interpreter by default) // this is different than user's 'startup.py' (below), since it is loaded just after Py_Initialize // it is very useful for cleaning sys.path, which may have undesireable paths, or for // isolating/loading the initial environ without requiring a virt env, e.g. homebrew or MacPorts installs on Mac runString( "pyqgstart = os.getenv('PYQGIS_STARTUP')\n" ); runString( "if pyqgstart is not None and os.path.exists(pyqgstart): execfile(pyqgstart)\n" ); #ifdef Q_OS_WIN runString( "oldhome=None" ); runString( "if os.environ.has_key('HOME'): oldhome=os.environ['HOME']\n" ); runString( "os.environ['HOME']=os.environ['USERPROFILE']\n" ); #endif // construct a list of plugin paths // plugin dirs passed in QGIS_PLUGINPATH env. variable have highest priority (usually empty) // locally installed plugins have priority over the system plugins // use os.path.expanduser to support usernames with special characters (see #2512) QStringList pluginpaths; foreach ( QString p, extraPluginsPaths() ) { if ( !QDir( p ).exists() ) { QgsMessageOutput* msg = QgsMessageOutput::createMessageOutput(); msg->setTitle( QObject::tr( "Python error" ) ); msg->setMessage( QString( QObject::tr( "The extra plugin path '%1' does not exist !" ) ).arg( p ), QgsMessageOutput::MessageText ); msg->showMessage(); } #ifdef Q_OS_WIN p = p.replace( '\\', "\\\\" ); #endif // we store here paths in unicode strings // the str constant will contain utf8 code (through runString) // so we call '...'.decode('utf-8') to make a unicode string pluginpaths << '"' + p + "\".decode('utf-8')"; } pluginpaths << homePluginsPath(); pluginpaths << '"' + pluginsPath() + '"'; // expect that bindings are installed locally, so add the path to modules // also add path to plugins QStringList newpaths; newpaths << '"' + pythonPath() + '"'; newpaths << homePythonPath(); newpaths << pluginpaths; runString( "sys.path = [" + newpaths.join( "," ) + "] + sys.path" ); // import SIP if ( !runString( "import sip", QObject::tr( "Couldn't load SIP module." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } // set PyQt4 api versions QStringList apiV2classes; apiV2classes << "QDate" << "QDateTime" << "QString" << "QTextStream" << "QTime" << "QUrl" << "QVariant"; foreach ( const QString& clsName, apiV2classes ) { if ( !runString( QString( "sip.setapi('%1', 2)" ).arg( clsName ), QObject::tr( "Couldn't set SIP API versions." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } } // import Qt bindings if ( !runString( "from PyQt4 import QtCore, QtGui", QObject::tr( "Couldn't load PyQt4." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } // import QGIS bindings QString error_msg = QObject::tr( "Couldn't load PyQGIS." ) + "\n" + QObject::tr( "Python support will be disabled." ); if ( !runString( "from qgis.core import *", error_msg ) || !runString( "from qgis.gui import *", error_msg ) ) { exitPython(); return; } // import QGIS utils error_msg = QObject::tr( "Couldn't load QGIS utils." ) + "\n" + QObject::tr( "Python support will be disabled." ); if ( !runString( "import qgis.utils", error_msg ) ) { exitPython(); return; } // tell the utils script where to look for the plugins runString( "qgis.utils.plugin_paths = [" + pluginpaths.join( "," ) + "]" ); runString( "qgis.utils.sys_plugin_path = \"" + pluginsPath() + "\"" ); runString( "qgis.utils.home_plugin_path = " + homePluginsPath() ); #ifdef Q_OS_WIN runString( "if oldhome: os.environ['HOME']=oldhome\n" ); #endif // initialize 'iface' object runString( "qgis.utils.initInterface(" + QString::number(( unsigned long ) interface ) + ")" ); QString startuppath = homePythonPath() + " + \"/startup.py\""; runString( "if os.path.exists(" + startuppath + "): from startup import *\n" ); // release GIL! // Later on, we acquire GIL just before doing some Python calls and // release GIL again when the work with Python API is done. // (i.e. there must be PyGILState_Ensure + PyGILState_Release pair // around any calls to Python API, otherwise we may segfault!) _mainState = PyEval_SaveThread(); }
void QgsPythonUtilsImpl::initPython( QgisInterface* interface ) { // initialize python Py_Initialize(); mPythonEnabled = true; mMainModule = PyImport_AddModule( "__main__" ); // borrowed reference mMainDict = PyModule_GetDict( mMainModule ); // borrowed reference runString( "import sys" ); // import sys module (for display / exception hooks) runString( "import os" ); // import os module (for user paths) // construct a list of plugin paths // plugin dirs passed in QGIS_PLUGINPATH env. variable have highest priority (usually empty) // locally installed plugins have priority over the system plugins QStringList pluginpaths = extraPluginsPaths(); pluginpaths << homePluginsPath() << pluginsPath(); // expect that bindings are installed locally, so add the path to modules // also add path to plugins QStringList newpaths; newpaths << pythonPath() << homePythonPath(); newpaths += pluginpaths; runString( "sys.path = [\"" + newpaths.join( "\", \"" ) + "\"] + sys.path" ); // import SIP if ( !runString( "from sip import wrapinstance, unwrapinstance", QObject::tr( "Couldn't load SIP module." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } // import Qt bindings if ( !runString( "from PyQt4 import QtCore, QtGui", QObject::tr( "Couldn't load PyQt4." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } // import QGIS bindings QString error_msg = QObject::tr( "Couldn't load PyQGIS." ) + "\n" + QObject::tr( "Python support will be disabled." ); if ( !runString( "from qgis.core import *", error_msg ) || !runString( "from qgis.gui import *", error_msg ) ) { exitPython(); return; } // import QGIS utils error_msg = QObject::tr( "Couldn't load QGIS utils." ) + "\n" + QObject::tr( "Python support will be disabled." ); if ( !runString( "import qgis.utils", error_msg ) ) { exitPython(); return; } // tell the utils script where to look for the plugins runString( "qgis.utils.plugin_paths = [\"" + pluginpaths.join( "\",\"" ) + "\"]" ); // initialize 'iface' object runString( "qgis.utils.initInterface(" + QString::number(( unsigned long ) interface ) + ")" ); }
void QgsPythonUtilsImpl::initPython( QgisInterface* interface ) { // initialize python Py_Initialize(); mPythonEnabled = true; mMainModule = PyImport_AddModule( "__main__" ); // borrowed reference mMainDict = PyModule_GetDict( mMainModule ); // borrowed reference runString( "import sys" ); // import sys module (for display / exception hooks) // expect that bindings are installed locally, so add the path to modules // also add path to plugins runString( "sys.path = [\"" + pythonPath() + "\", \"" + homePluginsPath() + "\", \"" + pluginsPath() + "\"] + sys.path" ); runString( "import traceback" ); // for formatting stack traces runString( "import __main__" ); // to access explicitly global variables // import SIP if ( !runString( "from sip import wrapinstance, unwrapinstance", QObject::tr( "Couldn't load SIP module." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } // import Qt bindings if ( !runString( "from PyQt4 import QtCore, QtGui", QObject::tr( "Couldn't load PyQt4." ) + "\n" + QObject::tr( "Python support will be disabled." ) ) ) { exitPython(); return; } // import QGIS bindings QString error_msg = QObject::tr( "Couldn't load PyQGIS." ) + "\n" + QObject::tr( "Python support will be disabled." ); if ( !runString( "from qgis.core import *", error_msg ) || !runString( "from qgis.gui import *", error_msg ) ) { exitPython(); return; } // hook that will show information and traceback in message box runString( "def qgis_except_hook_msg(type, value, tb, msg):\n" " lst = traceback.format_exception(type, value, tb)\n" " if msg == None: msg = '" + QObject::tr( "An error has occured while executing Python code:" ).replace( "'", "\\'" ) + "'\n" " txt = '<font color=\"red\">'+msg+'</font><br><br>'\n" " for s in lst:\n" " txt += s\n" " txt += '<br>" + QObject::tr( "Python version:" ).replace( "'", "\\'" ) + "<br>' + sys.version + '<br><br>'\n" " txt += '" + QObject::tr( "Python path:" ).replace( "'", "\\'" ) + "' + str(sys.path)\n" " txt = txt.replace('\\n', '<br>')\n" " txt = txt.replace(' ', ' ')\n" // preserve whitespaces for nicer output " \n" " msg = QgsMessageOutput.createMessageOutput()\n" " msg.setTitle('" + QObject::tr( "Python error" ).replace( "'", "\\'" ) + "')\n" " msg.setMessage(txt, QgsMessageOutput.MessageHtml)\n" " msg.showMessage()\n" ); runString( "def qgis_except_hook(type, value, tb):\n" " qgis_except_hook_msg(type, value, tb, None)\n" ); runString( "class QgisOutputCatcher:\n" " def __init__(self):\n" " self.data = ''\n" " def write(self, stuff):\n" " self.data += stuff\n" " def get_and_clean_data(self):\n" " tmp = self.data\n" " self.data = ''\n" " return tmp\n" ); // hook for python console so all output will be redirected // and then shown in console runString( "def console_display_hook(obj):\n" " __main__.__result = obj\n" ); installErrorHook(); // initialize 'iface' object runString( "iface = wrapinstance(" + QString::number(( unsigned long ) interface ) + ", QgisInterface)" ); runString( "plugins = {}" ); }