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());