#include <config.h>
+#ifdef _WIN32
+# define _WIN32_WINNT 0x0600
+#endif
+
#include "support/convert.h"
#include "support/debug.h"
#include "support/filetools.h"
static string const python23_call(string const & binary, bool verbose = false)
{
- const string version_info = " -c 'from __future__ import print_function;import sys; print(sys.version_info[:2], end=\"\")'";
- static regex const python_reg("\\((\\d*), (\\d*)\\)");
+ const string version_info = " -c \"from __future__ import print_function;import sys; print(sys.version_info[:2], end=\\\"\\\")\"";
// Default to "python" if no binary is given.
if (binary.empty())
return "python -tt";
cmd_ret const out = runCommand(binary + version_info);
smatch sm;
- if (out.first < 0 || !regex_match(out.second, sm, python_reg))
+ try {
+ static regex const python_reg("\\((\\d*), (\\d*)\\)");
+ if (out.first < 0 || !regex_match(out.second, sm, python_reg))
+ return string();
+ } catch(regex_error const & /*e*/) {
+ LYXERR0("Regex error! This should not happen.");
return string();
+ }
int major = convert<int>(sm.str(1));
int minor = convert<int>(sm.str(2));
- if((major == 2 && minor < 7) || (major == 3 && minor < 4))
+ if((major == 2 && minor < 7) || (major == 3 && minor < 5))
return string();
if (verbose)
// PEP 397 -- Python launcher for Windows
// https://www.python.org/dev/peps/pep-0397/
+#ifdef _WIN32
+ // Check through python launcher whether python 3 is
+ // installed on computer.
+ string command = python23_call("py -3");
+#else
// Check whether python3 in PATH is the right one.
string command = python23_call("python3");
+#endif // _WIN32
if (!command.empty())
return command;
+#ifndef _WIN32
// python3 does not exists, let us try to find python3.x in PATH
// the search is probably broader than required
// but we are trying hard to find a valid python binary
vector<string> const path = getEnvPath("PATH");
lyxerr << "Looking for python 3.x ...\n";
- for (auto bin: path) {
+ for (auto bin : path) {
QString const dir = toqstr(bin);
string const localdir = dir.toLocal8Bit().constData();
QDir qdir(dir);
qdir.setFilter(QDir::Files | QDir::Executable);
QStringList list = qdir.entryList(QStringList("python3*"));
- for (auto bin: list) {
- string const binary = addName(localdir,
- bin.toLocal8Bit().constData());
+ for (auto bin2 : list) {
+ string const binary = "\"" + addName(localdir,
+ bin2.toLocal8Bit().constData()) + "\"";
command = python23_call(binary, true);
if (!command.empty())
return command;
}
}
+#endif // !_WIN32
// python 3 was not found let us look for python 2
+#ifdef _WIN32
+ command = python23_call("py -2");
+#else
command = python23_call("python2");
+#endif // _WIN32
if (!command.empty())
return command;
+#ifdef _WIN32
+ // python launcher is not installed, let cmd auto check
+ // PATH for a python.exe
+ command = python23_call("python");
+ if (!command.empty())
+ return command;
+
+ //failed, prepare to search PATH manually
+ vector<string> const path = getEnvPath("PATH");
+ lyxerr << "Manually looking for python in PATH ...\n";
+ QString const exeName = "python*";
+#else
// python2 does not exists, let us try to find python2.x in PATH
// the search is probably broader than required
// but we are trying hard to find a valid python binary
lyxerr << "Looking for python 2.x ...\n";
- for (auto bin: path) {
+ QString const exeName = "python2*";
+#endif // _WIN32
+
+ for (auto bin : path) {
QString const dir = toqstr(bin);
string const localdir = dir.toLocal8Bit().constData();
QDir qdir(dir);
qdir.setFilter(QDir::Files | QDir::Executable);
- QStringList list = qdir.entryList(QStringList("python2*"));
- for (auto bin: list) {
- string const binary = addName(localdir,
- bin.toLocal8Bit().constData());
+ QStringList list = qdir.entryList(QStringList(exeName));
+ for (auto bin2 : list) {
+ string const binary = "\"" + addName(localdir,
+ bin2.toLocal8Bit().constData()) + "\"";
command = python23_call(binary, true);
if (!command.empty())
return command;