mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-23 05:25:26 +00:00
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. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40049 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
e02df14faa
commit
775466100f
@ -100,8 +100,13 @@ ProgressInterface* ProgressInterface::instance()
|
|||||||
int Systemcall::startscript(Starttype how, string const & what,
|
int Systemcall::startscript(Starttype how, string const & what,
|
||||||
std::string const & path, bool /*process_events*/)
|
std::string const & path, bool /*process_events*/)
|
||||||
{
|
{
|
||||||
string command =
|
string const python_call = "python -tt";
|
||||||
to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path))) + what;
|
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) {
|
if (how == DontWait) {
|
||||||
switch (os::shell()) {
|
switch (os::shell()) {
|
||||||
@ -162,9 +167,16 @@ string const parsecmd(string const & inputcmd, string & outfile)
|
|||||||
bool in_single_quote = false;
|
bool in_single_quote = false;
|
||||||
bool in_double_quote = false;
|
bool in_double_quote = false;
|
||||||
bool escaped = false;
|
bool escaped = false;
|
||||||
|
string const python_call = "python -tt";
|
||||||
string cmd;
|
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];
|
char c = inputcmd[i];
|
||||||
if (c == '\'') {
|
if (c == '\'') {
|
||||||
if (in_double_quote || escaped) {
|
if (in_double_quote || escaped) {
|
||||||
|
@ -4,13 +4,19 @@
|
|||||||
* Licence details can be found in the file COPYING.
|
* Licence details can be found in the file COPYING.
|
||||||
*
|
*
|
||||||
* \author Ruurd A. Reitsma
|
* \author Ruurd A. Reitsma
|
||||||
|
* \author Enrico Forestieri
|
||||||
*
|
*
|
||||||
* Full author contact details are available in file CREDITS.
|
* Full author contact details are available in file CREDITS.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#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"
|
#include "support/os_cygwin.cpp"
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
#include "support/os_win32.cpp"
|
#include "support/os_win32.cpp"
|
||||||
@ -31,11 +37,57 @@ namespace lyx {
|
|||||||
namespace support {
|
namespace support {
|
||||||
namespace os {
|
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()
|
string const python()
|
||||||
{
|
{
|
||||||
// Use the -tt switch so that mixed tab/whitespace indentation is
|
// Check whether the first python in PATH is the right one.
|
||||||
// an error
|
static string command = python2("python -tt");
|
||||||
static string const command("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;
|
return command;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user