/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on Jun 25, 2006 * @author Fabio */ package org.python.pydev.runners; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; import org.eclipse.core.runtime.NullProgressMonitor; import org.python.pydev.core.IPythonNature; import org.python.pydev.shared_core.string.StringUtils; import org.python.pydev.shared_core.structure.Tuple; public class SimpleExeRunner extends SimpleRunner { /** * Some notes on what has to be converted for cygwin: * - cygwin will accept both formats for the script * - PYTHONPATH, the paths MUST be in cygwin format * - In python, internally, all needs to be in cygwin paths. * * below are the 'interactive' execution of python to validate what's written above. * * 1. cygwin will accept both formats for the script: * * >>c:\bin\cygwin\bin\python2.4.exe c:\temp\test.py * worked * >>c:\bin\cygwin\bin\python2.4.exe /cygdrive/c/temp/test.py * worked * * * 2. Now, for the pythonpath, the paths MUST be in cygwin format: * * >>set pythonpath="c:/temp" * * >>c:\bin\cygwin\bin\python2.4.exe /cygdrive/c/temp/test.py * /cygdrive/c/temp * /cygdrive/c/bin/4nt600/"c << yeap, here is the error. I have no idea why it happens. * /temp" * /usr/lib/python24.zip * ... * * >>set pythonpath="/cygdrive/c/temp" * * >>c:\bin\cygwin\bin\python2.4.exe /cygdrive/c/temp/test.py * /cygdrive/c/temp * /cygdrive/c/bin/"/cygdrive/c/temp" * /usr/lib/python24.zip * ... * * * In python, internally, all needs to be in cygwin paths: * print os.path.abspath(os.path.curdir) * will return /cygwin/c/bin * * @param cygpathLoc the cygpath.exe location * @param paths the windows paths to be converted to cygwin. * @return a list of changed paths converted to cygwin. */ public List<String> convertToCygwinPath(String cygpathLoc, String... paths) { for (int i = 0; i < paths.length; i++) { paths[i] = StringUtils.replaceAllSlashes(paths[i]); } ArrayList<String> ret = new ArrayList<String>(); List<String> asList = new ArrayList<String>(Arrays.asList(paths)); asList.add(0, cygpathLoc); Tuple<String, String> output = runAndGetOutput(asList.toArray(new String[0]), (File) null, (IPythonNature) null, new NullProgressMonitor(), "utf-8"); if (output.o2 != null && output.o2.length() > 0) { throw new RuntimeException("Error converting windows paths to cygwin paths: " + output.o2 + ".\nCygpath location:" + cygpathLoc); } if (output.o1 == null || output.o1.length() == 0) { throw new RuntimeException("Unable to get the output.\nCygpath location:" + cygpathLoc); } StringTokenizer tokenizer = new StringTokenizer(output.o1, "\r\n"); while (tokenizer.hasMoreTokens()) { String tok = tokenizer.nextToken(); ret.add(tok.trim()); } return ret; } }