]> git.lyx.org Git - features.git/commitdiff
Detect the correct version of python at runtime and store the result
authorEnrico Forestieri <forenr@lyx.org>
Fri, 28 Oct 2011 11:51:48 +0000 (11:51 +0000)
committerEnrico Forestieri <forenr@lyx.org>
Fri, 28 Oct 2011 11:51:48 +0000 (11:51 +0000)
for later calls. The check is only performed on the major version
number, such as to avoid using python 3.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40049 a592a061-630c-0410-9148-cb99ea01b6c8

src/support/Systemcall.cpp
src/support/os.cpp

index f8db8b0b689d633657b1ef761964653658cacc91..bc7790adb17cdd8f8dbd4f123836e6bb5610a09d 100644 (file)
@@ -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;
+
+       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) {
index 820f4e9a66be3b8c32b4362843657b530230c629..a18637c7724a8bc84c649f2cf67167fe819860ac 100644 (file)
@@ -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 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<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;
 }