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()) {
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) {
* 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"
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;
}