From 38a6f4cc348ad9b2e82528c68d37e126081cc6f4 Mon Sep 17 00:00:00 2001 From: ngosang Date: Sat, 25 Jul 2015 14:26:56 +0200 Subject: [PATCH] Improve Python detection --- src/core/utils/misc.cpp | 116 +++++++++++++++++----------------------- src/gui/mainwindow.cpp | 34 ++---------- 2 files changed, 52 insertions(+), 98 deletions(-) diff --git a/src/core/utils/misc.cpp b/src/core/utils/misc.cpp index 97f5508dd..3eba4280f 100644 --- a/src/core/utils/misc.cpp +++ b/src/core/utils/misc.cpp @@ -226,74 +226,56 @@ QPoint Utils::Misc::screenCenter(QWidget *win) #endif /** - * Detects the version of python by calling - * "python --version" and parsing the output. + * Detects the python version. */ int Utils::Misc::pythonVersion() { static int version = -1; if (version < 0) { - QProcess python_proc; -#if defined(Q_OS_UNIX) - /* - * On Unix-Like Systems python2 and python3 should always exist - * http://legacy.python.org/dev/peps/pep-0394/ - */ - python_proc.start("python3", QStringList() << "--version", QIODevice::ReadOnly); - if (python_proc.waitForFinished()) { - if (python_proc.exitCode() == 0) { - QByteArray output = python_proc.readAllStandardOutput(); - if (output.isEmpty()) - output = python_proc.readAllStandardError(); - const QByteArray version_str = output.split(' ').last(); - Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python version: %1").arg(QString(version_str)), Log::INFO); - version = 3; - return 3; - } - } - python_proc.start("python2", QStringList() << "--version", QIODevice::ReadOnly); - if (python_proc.waitForFinished()) { - if (python_proc.exitCode() == 0) { - QByteArray output = python_proc.readAllStandardOutput(); - if (output.isEmpty()) - output = python_proc.readAllStandardError(); - const QByteArray version_str = output.split(' ').last(); - Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python version: %1").arg(QString(version_str)), Log::INFO); - version = 2; - return 2; - } + QString versionComplete = pythonVersionComplete().trimmed(); + QStringList splitted = versionComplete.split('.'); + if (splitted.size() > 1) { + int highVer = splitted.at(0).toInt(); + if ((highVer == 2) || (highVer == 3)) + version = highVer; } -#else - python_proc.start("python", QStringList() << "--version", QIODevice::ReadOnly); - if (!python_proc.waitForFinished()) return -1; - if (python_proc.exitCode() < 0) return -1; - QByteArray output = python_proc.readAllStandardOutput(); - if (output.isEmpty()) - output = python_proc.readAllStandardError(); - const QByteArray version_str = output.split(' ').last(); - Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python version: %1").arg(QString(version_str)), Log::INFO); - if (version_str.startsWith("3.")) - version = 3; - else - version = 2; -#endif } return version; } +/** + * Detects the python executable by calling "python --version". + */ QString Utils::Misc::pythonExecutable() { + static QString executable; + if (executable.isEmpty()) { + QProcess pythonProc; #if defined(Q_OS_UNIX) - /* - * On Unix-Like Systems python2 and python3 should always exist - * http://legacy.python.org/dev/peps/pep-0394/ - */ - if (pythonVersion() == 3) - return "python3"; - if (pythonVersion() == 2) - return "python2"; + /* + * On Unix-Like Systems python2 and python3 should always exist + * http://legacy.python.org/dev/peps/pep-0394/ + */ + pythonProc.start("python3", QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) { + executable = "python3"; + return executable; + } + pythonProc.start("python2", QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) { + executable = "python2"; + return executable; + } #endif - return "python"; + // Look for "python" in Windows and in UNIX if "python2" and "python3" are + // not detected. + pythonProc.start("python", QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) + executable = "python"; + else + Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python not detected"), Log::INFO); + } + return executable; } /** @@ -303,22 +285,20 @@ QString Utils::Misc::pythonExecutable() */ QString Utils::Misc::pythonVersionComplete() { static QString version; - if (version.isEmpty()) { - if (pythonVersion() < 0) - return QString(); - - QProcess python_proc; - python_proc.start(pythonExecutable(), QStringList() << "--version", QIODevice::ReadOnly); - if (!python_proc.waitForFinished()) return QString(); - if (python_proc.exitCode() < 0) return QString(); - QByteArray output = python_proc.readAllStandardOutput(); - if (output.isEmpty()) - output = python_proc.readAllStandardError(); - const QByteArray version_str = output.split(' ').last(); - version = version_str; + if (pythonExecutable().isEmpty()) + return version; + QProcess pythonProc; + pythonProc.start(pythonExecutable(), QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) { + QByteArray output = pythonProc.readAllStandardOutput(); + if (output.isEmpty()) + output = pythonProc.readAllStandardError(); + const QByteArray versionStr = output.split(' ').last(); + version = versionStr.trimmed(); + Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python version: %1").arg(version), Log::INFO); + } } - return version; } diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 32a172f5e..3facd818c 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -1377,36 +1377,13 @@ void MainWindow::on_actionSearch_engine_triggered() bool res = false; - if (pythonVersion == 2) { - // Check if python 2.7.x or later - QString version = Utils::Misc::pythonVersionComplete().trimmed(); + if ((pythonVersion == 2) || (pythonVersion == 3)) { + // Check python minimum requirement: 2.7.0/3.3.0 + QString version = Utils::Misc::pythonVersionComplete(); QStringList splitted = version.split('.'); if (splitted.size() > 1) { int middleVer = splitted.at(1).toInt(); - if (middleVer < 7) { - QMessageBox::information(this, tr("Old Python Interpreter"), tr("Your Python version is %1, which is too old. You need at least version 2.7.0 for python2 or 3.3.0 for python3.").arg(version)); - actionSearch_engine->setChecked(false); - Preferences::instance()->setSearchEnabled(false); - return; - } - else { - res = true; - } - } - else { - QMessageBox::information(this, tr("Undetermined Python version"), tr("Couldn't decode your Python version: %1").arg(version)); - actionSearch_engine->setChecked(false); - Preferences::instance()->setSearchEnabled(false); - return; - } - } - else if (pythonVersion == 3) { - // Check if python 3.3.x or later - QString version = Utils::Misc::pythonVersionComplete().trimmed(); - QStringList splitted = version.split('.'); - if (splitted.size() > 1) { - int middleVer = splitted.at(1).toInt(); - if (middleVer < 3) { + if ((pythonVersion == 2 && middleVer < 7) || (pythonVersion == 3 && middleVer < 3)) { QMessageBox::information(this, tr("Old Python Interpreter"), tr("Your Python version %1 is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.0/3.3.0.").arg(version)); actionSearch_engine->setChecked(false); Preferences::instance()->setSearchEnabled(false); @@ -1423,9 +1400,6 @@ void MainWindow::on_actionSearch_engine_triggered() return; } } - else { - res = false; - } if (res) { has_python = true;