diff --git a/src/core/preferences.cpp b/src/core/preferences.cpp index 2259661a6..6b2af1979 100644 --- a/src/core/preferences.cpp +++ b/src/core/preferences.cpp @@ -1763,11 +1763,12 @@ QString Preferences::getPythonPath() return path; // Fallback: Detect python from default locations - QStringList supported_versions; - supported_versions << "34" << "33" << "32" << "31" << "30" << "27" << "26" << "25"; - foreach (const QString &v, supported_versions) - if (QFile::exists("C:/Python" + v + "/python.exe")) - return "C:/Python" + v; + const QStringList dirs = QDir("C:/").entryList(QStringList("Python*"), QDir::Dirs, QDir::Name | QDir::Reversed); + foreach (const QString &dir, dirs) { + const QString path("C:/" + dir + "/python.exe"); + if (QFile::exists(path)) + return path; + } return QString(); } diff --git a/src/core/utils/misc.cpp b/src/core/utils/misc.cpp index f08465098..3dc6927c2 100644 --- a/src/core/utils/misc.cpp +++ b/src/core/utils/misc.cpp @@ -233,6 +233,26 @@ int Utils::Misc::pythonVersion() static int version = -1; if (version < 0) { QProcess python_proc; +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + /* + * 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) { + version = 3; + return 3; + } + } + python_proc.start("python2", QStringList() << "--version", QIODevice::ReadOnly); + if (python_proc.waitForFinished()) { + if (python_proc.exitCode() == 0) { + version = 2; + return 2; + } + } +#else python_proc.start("python", QStringList() << "--version", QIODevice::ReadOnly); if (!python_proc.waitForFinished()) return -1; if (python_proc.exitCode() < 0) return -1; @@ -245,10 +265,26 @@ int Utils::Misc::pythonVersion() version = 3; else version = 2; +#endif } return version; } +QString Utils::Misc::pythonExecutable() +{ +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + /* + * 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"; +#endif + return "python"; +} + // return best userfriendly storage unit (B, KiB, MiB, GiB, TiB) // use Binary prefix standards from IEC 60027-2 // see http://en.wikipedia.org/wiki/Kilobyte diff --git a/src/core/utils/misc.h b/src/core/utils/misc.h index c69061c20..dc003674f 100644 --- a/src/core/utils/misc.h +++ b/src/core/utils/misc.h @@ -56,6 +56,7 @@ namespace Utils QPoint screenCenter(QWidget *win); #endif int pythonVersion(); + QString pythonExecutable(); // return best userfriendly storage unit (B, KiB, MiB, GiB, TiB) // use Binary prefix standards from IEC 60027-2 // see http://en.wikipedia.org/wiki/Kilobyte diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index a8a226de8..db6328e41 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -1380,7 +1380,7 @@ void MainWindow::on_actionSearch_engine_triggered() has_python = true; } else if (QMessageBox::question(this, tr("Missing Python Interpreter"), - tr("Python 2.x is required to use the search engine but it does not seem to be installed.\nDo you want to install it now?"), + tr("Python is required to use the search engine but it does not seem to be installed.\nDo you want to install it now?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { // Download and Install Python installPython(); @@ -1570,7 +1570,7 @@ void MainWindow::installPython() { setCursor(QCursor(Qt::WaitCursor)); // Download python - Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl("http://python.org/ftp/python/2.7.3/python-2.7.3.msi"); + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl("https://www.python.org/ftp/python/3.4.3/python-3.4.3.msi"); connect(handler, SIGNAL(downloadFinished(QString, QString)), this, SLOT(pythonDownloadSuccess(QString, QString))); connect(handler, SIGNAL(downloadFailed(QString, QString)), this, SLOT(pythonDownloadFailure(QString, QString))); } diff --git a/src/searchengine/searchengine.cpp b/src/searchengine/searchengine.cpp index cd287afe2..d56ebefab 100644 --- a/src/searchengine/searchengine.cpp +++ b/src/searchengine/searchengine.cpp @@ -182,6 +182,11 @@ void SearchEngine::giveFocusToSearchInput() { // Function called when we click on search button void SearchEngine::on_search_button_clicked() { + if (Utils::Misc::pythonVersion() < 0) { + mp_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Please install Python to use the Search Engine.")); + return; + } + if (searchProcess->state() != QProcess::NotRunning) { #ifdef Q_OS_WIN searchProcess->kill(); @@ -236,7 +241,7 @@ void SearchEngine::on_search_button_clicked() { // Changing the text of the current label currentSearchTab->getCurrentLabel()->setText(tr("Results")+" (0):"); // Launch search - searchProcess->start("python", params, QIODevice::ReadOnly); + searchProcess->start(Utils::Misc::pythonExecutable(), params, QIODevice::ReadOnly); searchTimeout->start(180000); // 3min } @@ -276,7 +281,7 @@ void SearchEngine::downloadTorrent(QString engine_url, QString torrent_url) { params << engine_url; params << torrent_url; // Launch search - downloadProcess->start("python", params, QIODevice::ReadOnly); + downloadProcess->start(Utils::Misc::pythonExecutable(), params, QIODevice::ReadOnly); } } diff --git a/src/searchengine/supportedengines.h b/src/searchengine/supportedengines.h index a03db1b41..defe3531b 100644 --- a/src/searchengine/supportedengines.h +++ b/src/searchengine/supportedengines.h @@ -42,6 +42,7 @@ #include #include "core/utils/fs.h" +#include "core/utils/misc.h" #include "core/preferences.h" class SearchCategories: public QObject, public QHash { @@ -150,7 +151,7 @@ public slots: QStringList params; params << Utils::Fs::toNativePath(Utils::Fs::searchEngineLocation()+"/nova2.py"); params << "--capabilities"; - nova.start("python", params, QIODevice::ReadOnly); + nova.start(Utils::Misc::pythonExecutable(), params, QIODevice::ReadOnly); nova.waitForStarted(); nova.waitForFinished(); QString capabilities = QString(nova.readAll());