diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp index f8db8b0b68..bc7790adb1 100644 --- a/src/support/Systemcall.cpp +++ b/src/support/Systemcall.cpp @@ -100,8 +100,13 @@ ProgressInterface* ProgressInterface::instance() int Systemcall::startscript(Starttype how, string const & what, std::string const & path, bool /*process_events*/) { - string command = - to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path))) + what; + string const python_call = "python -tt"; + string command = to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path))); + + if (prefixIs(what, python_call)) + command += os::python() + what.substr(python_call.length()); + else + command += what; if (how == DontWait) { switch (os::shell()) { @@ -162,9 +167,16 @@ string const parsecmd(string const & inputcmd, string & outfile) bool in_single_quote = false; bool in_double_quote = false; bool escaped = false; + string const python_call = "python -tt"; string cmd; + int start = 0; - for (size_t i = 0; i < inputcmd.length(); ++i) { + if (prefixIs(inputcmd, python_call)) { + cmd = os::python(); + start = python_call.length(); + } + + for (size_t i = start; i < inputcmd.length(); ++i) { char c = inputcmd[i]; if (c == '\'') { if (in_double_quote || escaped) { diff --git a/src/support/os.cpp b/src/support/os.cpp index 820f4e9a66..a18637c772 100644 --- a/src/support/os.cpp +++ b/src/support/os.cpp @@ -4,13 +4,19 @@ * Licence details can be found in the file COPYING. * * \author Ruurd A. Reitsma + * \author Enrico Forestieri * * Full author contact details are available in file CREDITS. */ #include -#if defined(__CYGWIN__) || defined(__CYGWIN32__) +#include "filetools.h" +#include "qstring_helpers.h" + +#include + +#if defined(__CYGWIN__) #include "support/os_cygwin.cpp" #elif defined(_WIN32) #include "support/os_win32.cpp" @@ -31,11 +37,57 @@ namespace lyx { namespace support { namespace os { +static string const python2(string const & binary, bool verbose = false) +{ + if (verbose) + lyxerr << "Examining " << binary << "\n"; + + // Check whether this is a python 2 binary. + cmd_ret const out = runCommand(binary + " -V 2>&1"); + if (out.first < 0 || !prefixIs(out.second, "Python 2")) + return string(); + + if (verbose) + lyxerr << "Found " << out.second << "\n"; + return binary; +} + + string const python() { - // Use the -tt switch so that mixed tab/whitespace indentation is - // an error - static string const command("python -tt"); + // Check whether the first python in PATH is the right one. + static string command = python2("python -tt"); + + if (command.empty()) { + // It was not, so check whether we can find it elsewhere in + // PATH, maybe with some suffix appended. + vector const path = getEnvPath("PATH"); + vector::const_iterator it = path.begin(); + vector::const_iterator const end = path.end(); + lyxerr << "Looking for python v2.x ...\n"; + for (; it != end; ++it) { + QString const dir = toqstr(*it); + string const localdir = dir.toLocal8Bit().constData(); + QDir qdir(dir); + qdir.setFilter(QDir::Files | QDir::Executable); + QStringList list = qdir.entryList(QStringList("python*")); + for (int i = 0; i < list.size() && command.empty(); ++i) { + string const binary = addName(localdir, + list.at(i).toLocal8Bit().constData()); + command = python2(binary, true); + } + } + + // Default to "python" if no usable binary was found. + if (command.empty()) { + lyxerr << "Warning: No python v2.x binary found.\n"; + command = "python"; + } + + // Add the -tt switch so that mixed tab/whitespace + // indentation is an error + command += " -tt"; + } return command; }