On Fri, Oct 28, 2011 at 01:51:49PM +0200, for...@lyx.org wrote: > Author: forenr > Date: Fri Oct 28 13:51:48 2011 > New Revision: 40049 > URL: http://www.lyx.org/trac/changeset/40049 > > Log: > Detect the correct version of python at runtime and store the result > for later calls. The check is only performed on the major version > number, such as to avoid using python 3.
What about branch? > Modified: > lyx-devel/trunk/src/support/Systemcall.cpp > lyx-devel/trunk/src/support/os.cpp > > Modified: lyx-devel/trunk/src/support/Systemcall.cpp > ============================================================================== > --- lyx-devel/trunk/src/support/Systemcall.cpp Fri Oct 28 10:41:43 > 2011 (r40048) > +++ lyx-devel/trunk/src/support/Systemcall.cpp Fri Oct 28 13:51:48 > 2011 (r40049) > @@ -100,8 +100,13 @@ > 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 @@ > bool in_single_quote = false; > bool in_double_quote = false; > bool escaped = false; > + string const python_call = "python -tt"; > string cmd; > + int start = 0; > + > + if (prefixIs(inputcmd, python_call)) { > + cmd = os::python(); > + start = python_call.length(); > + } > > - for (size_t i = 0; i < inputcmd.length(); ++i) { > + for (size_t i = start; i < inputcmd.length(); ++i) { > char c = inputcmd[i]; > if (c == '\'') { > if (in_double_quote || escaped) { > > Modified: lyx-devel/trunk/src/support/os.cpp > ============================================================================== > --- lyx-devel/trunk/src/support/os.cpp Fri Oct 28 10:41:43 2011 > (r40048) > +++ lyx-devel/trunk/src/support/os.cpp Fri Oct 28 13:51:48 2011 > (r40049) > @@ -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 <config.h> > > -#if defined(__CYGWIN__) || defined(__CYGWIN32__) > +#include "filetools.h" > +#include "qstring_helpers.h" > + > +#include <QDir> > + > +#if defined(__CYGWIN__) > #include "support/os_cygwin.cpp" > #elif defined(_WIN32) > #include "support/os_win32.cpp" > @@ -31,11 +37,57 @@ > 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<string> const path = getEnvPath("PATH"); > + vector<string>::const_iterator it = path.begin(); > + vector<string>::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; > } > -- Enrico