Detect Python interpreter on Windows (the search engine is now working!)

This commit is contained in:
Christophe Dumez
2010-05-30 14:46:47 +00:00
parent 11f79432b5
commit 4eb8be372e
5 changed files with 84 additions and 6 deletions

View File

@@ -916,6 +916,18 @@ public:
settings.setValue(QString::fromUtf8("Preferences/Connection/ResolvePeerHostNames"), resolve);
}
#ifdef Q_WS_WIN
static void setPythonPath(QString path) {
QSettings settings("qBittorrent", "qBittorrent");
settings.setValue(QString::fromUtf8("Preferences/Win32/PythonPath"), path);
}
static QString getPythonPath() {
QSettings settings("qBittorrent", "qBittorrent");
return settings.value(QString::fromUtf8("Preferences/Win32/PythonPath"), "").toString();
}
#endif
};
#endif // PREFERENCES_H

View File

@@ -42,11 +42,17 @@
#include <QClipboard>
#include <QMimeData>
#include <QSortFilterProxyModel>
#include <QFileDialog>
#ifdef Q_WS_WIN
#include <stdlib.h>
#endif
#include "searchengine.h"
#include "bittorrent.h"
#include "downloadthread.h"
#include "misc.h"
#include "preferences.h"
#include "searchlistdelegate.h"
#include "GUI.h"
@@ -72,13 +78,11 @@ SearchEngine::SearchEngine(GUI *parent, Bittorrent *BTSession) : QWidget(parent)
// Boolean initialization
search_stopped = false;
// Creating Search Process
#ifdef Q_WS_WIN
checkForPythonExe();
#endif
searchProcess = new QProcess(this);
QStringList env = QProcess::systemEnvironment();
#ifdef Q_WS_WIN
// add qBittorrent executable folder to PATH environment variable
qDebug("qBittorrent executable path: %s", qPrintable(qApp->applicationDirPath()));
env.replaceInStrings(QRegExp("^PATH=(.*)", Qt::CaseInsensitive), "PATH=\\1;"+qApp->applicationDirPath());
#endif
searchProcess->setEnvironment(env);
connect(searchProcess, SIGNAL(started()), this, SLOT(searchStarted()));
connect(searchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readSearchOutput()));
@@ -106,6 +110,62 @@ void SearchEngine::fillCatCombobox() {
}
}
#ifdef Q_WS_WIN
void SearchEngine::checkForPythonExe() {
QString python_path = Preferences::getPythonPath();
if(python_path.isEmpty() || !QFile::exists(python_path+QDir::separator()+"python.exe")) {
// Attempt to detect python in standard location
QStringList filters;
filters << "Python25" << "Python26";
QStringList python_folders = QDir::root().entryList(filters, QDir::Dirs, QDir::Name);
if(!python_folders.isEmpty()) {
python_path = QDir::root().absoluteFilePath(python_folders.last());
qDebug("Detected python folder at %s", qPrintable(python_path));
} else {
filters.clear();
filters << "Python*";
python_folders = QDir::root().entryList(filters, QDir::Dirs, QDir::Name);
if(!python_folders.isEmpty()) {
python_path = QDir::root().absoluteFilePath(python_folders.last());
qDebug("Detected python folder at %s", qPrintable(python_path));
} else {
qDebug("Failed to detect Python folder");
}
}
}
if(python_path.isEmpty() || !QFile::exists(python_path+QDir::separator()+"python.exe")) {
QMessageBox::warning(0, tr("Failed to locate the Python interpreter"), tr("The Python interpreter was not found.\nqBittorrent will now ask you to point to its correct location."));
QString python_exe_path = QFileDialog::getOpenFileName(0, tr("Please point to its location on your hard disk."),
QDir::root().absolutePath(), tr("Python executable (python.exe)"));
if(python_exe_path.isEmpty() || !QFile::exists(python_exe_path)) {
QMessageBox::warning(0, tr("No Python interpreter"), tr("The Python interpreter is missing. qBittorrent search engine will not work."));
return;
}
qDebug("Python exe path is: %s", qPrintable(python_exe_path));
QStringList tmp_list = python_exe_path.split(QDir::separator());
if(tmp_list.size() == 1)
tmp_list = tmp_list.first().split("/");
tmp_list.removeLast();
python_path = tmp_list.join(QDir::separator());
qDebug("New Python path is: %s", qPrintable(python_path));
// Save python path
Preferences::setPythonPath(python_path);
}
// Add it to PATH envvar
QString path_envar = QString::fromLocal8Bit(getenv("PATH"));
if(path_envar.isNull()) {
path_envar = "";
} else {
if(!path_envar.endsWith(";"))
path_envar += ";";
}
path_envar += python_path+";";
qDebug("New PATH envvar is: %s", qPrintable(path_envar));
QString envar = "PATH="+path_envar;
putenv(envar.toLocal8Bit().data());
}
#endif
QString SearchEngine::selectedCategory() const {
return comboCategory->itemData(comboCategory->currentIndex()).toString();
}

View File

@@ -126,6 +126,9 @@ protected slots:
void createCompleter();
void fillCatCombobox();
void searchTextEdited(QString);
#ifdef Q_WS_WIN
void checkForPythonExe();
#endif
};
#endif

View File

@@ -3,7 +3,7 @@ LANG_PATH = lang
ICONS_PATH = Icons
# Set the following variable to 1 to enable debug
DEBUG_MODE = 1
DEBUG_MODE = 0
# Global
TEMPLATE = app

View File

@@ -39,6 +39,7 @@
#include <QProcess>
#include <QSettings>
#include <QDir>
#include <QApplication>
#include "misc.h"
@@ -139,6 +140,7 @@ public:
public slots:
void update() {
QProcess nova;
nova.setEnvironment(QProcess::systemEnvironment());
QStringList params;
params << misc::searchEngineLocation()+QDir::separator()+"nova2.py";
params << "--capabilities";
@@ -149,6 +151,7 @@ public slots:
QDomDocument xml_doc;
if(!xml_doc.setContent(capabilities)) {
std::cerr << "Could not parse Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data() << std::endl;
std::cerr << "Error: " << nova.readAllStandardError().constData() << std::endl;
return;
}
QDomElement root = xml_doc.documentElement();