2013-10-14 65 views
0

繼承人我的代碼執行爲什麼這個python腳本沒有在java中

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

絕對路徑到您的.py文件將我會嘗試的第一件事。 –

回答

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,我覺得它要容易得多,儘管需要更多的代碼來使用。

+0

我得到1的退出狀態,有人提到它可能是因爲../沒有在exec()中解決,我怎麼能重新使用它? –

+0

@JakeSchievink使用腳本的完整路徑。 ../是與當前工作目錄相關的相對路徑。避免這樣做,並說明完整路徑(從根開始)。我沒有太多的Linux經驗,但在Windows上,它通常以C盤符開頭:絕對路徑的例子是C:\ scripts \ wc.py – initramfs

+0

感謝您的幫助,現在我運行它永遠不會通過waitFor()方法 –

0

您需要查看運行該命令返回的結果,而不是僅捕獲異常。

看看exitValue()和方法來獲取您的Process對象上的輸出和錯誤流。

我的猜測是python無法找到你的程序,因爲../被你的shell解決了,而使用exec啓動的程序並沒有從shell運行。

+0

退出狀態返回1 –

+0

如何解析../? –

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是找不到的。

+0

忽略我的代碼,CPU終結者提供了一個更好的解決方案。 – Daniel