继承我的代码
public void addImg(){
try{
//Attempt 1
Runtime r = Runtime.getRuntime();
Process p = r.exec("/usr/bin/python2.7 ../wc.py");
p.waitFor();
p.destroy();
//Attempt 2
p = r.exec("python2.7 ../wc.py");
p.waitFor();
p.destroy();
}catch (Exception e){
String cause = e.getMessage();
System.out.print(cause);
}
}
我一直试图让这个工作大约一个小时没有,似乎没有任何工作,并且没有显示错误。我更关心如何调试这个,但是我的代码有什么问题可以说明为什么这个脚本没有执行?
答案 0 :(得分:2)
如果exec()方法不立即抛出异常,则只表示它可以执行外部进程。但是不意味着它已成功执行或甚至正确执行。
有很多方法可以检查外部流程是否成功执行,下面列出了少数几个:
使用Process.getErrorStream()和Process.getInputStream()方法读取外部进程的输出。
查看外部进程的退出代码,代码0表示正常执行,否则可能发生错误。
考虑添加以下代码以进行调试:
public void addImg(){
try{
Runtime r = Runtime.getRuntime();
//Don't use this one...
//Process p = r.exec("/usr/bin/python2.7 ../wc.py");
//p.waitFor();
//p.destroy();
//Use absolute paths (e.g blahblah/foo/bar/wc.py)
p = r.exec("python2.7 ../wc.py");
//Set up two threads to read on the output of the external process.
Thread stdout = new Thread(new StreamReader(p.getInputStream()));
Thread stderr = new Thread(new StreamReader(p.getErrorStream()));
stdout.start();
stderr.start();
int exitval = p.waitFor();
p.destroy();
//Prints exit code to screen.
System.out.println("Process ended with exit code:" + exitval);
}catch(Exception e){
String cause = e.getMessage();
System.out.print(cause);
}
}
private class StreamReader implements Runnable{
private InputStream stream;
private boolean run;
public StreamReader(Inputstream i){
stream = i;
run = true;
}
public void run(){
BufferedReader reader;
try{
reader = new BufferedReader(new InputStreamReader(stream));
String line;
while(run && line != null){
System.out.println(line);
}
}catch(IOException ex){
//Handle if you want...
}finally{
try{
reader.close();
}catch(Exception e){}
}
}
}
另外,尝试在调用外部应用程序时使用ProcessBuilder,尽管需要更多代码,但我发现它更容易使用。
答案 1 :(得分:0)
您需要查看通过运行命令返回的结果,而不仅仅是捕获异常。
查看exitValue()
和方法,以获取Process对象上的输出和错误流。
我的猜测是python无法找到你的程序因为你的shell解析了../而使用exec启动的程序不是从shell运行的。
答案 2 :(得分:0)
打印错误流:
Runtime r = Runtime.getRuntime();
String line;
Process p = r.exec("/usr/bin/python2.7 ../wc.py");
InputStream stdin = p.getErrorStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
p.waitFor();
while ( (line = br.readLine()) != null)
System.out.println("-"+line);
p.destroy();
可能找不到wc.py。