2014-04-17 113 views
1

我想在Java中運行這個Python程序。程序終止沒有任何錯誤

問題: 當我從命令行運行此程序:Python的msp.py丹尼斯 - 聖 - 何塞 - 2 - 它WORKS

當我通過這個java程序調用相同的腳本。它只是終止。 我測試了其他的python腳本,他們工作!

public void pythonrun(String args) throws IOException, InterruptedException 
{ 
    String pythonScriptPath = "/yelp/msp.py"; 
    String[] cmd = new String[2 + args.length()]; 
    cmd[0] = "C:\\Python27\\python.exe"; 
    cmd[1] = pythonScriptPath; 
    for(int i = 0; i < args.length(); i++) { 
    cmd[i+2] = args; 
    } 

    // create runtime to execute external command 
    Runtime rt = Runtime.getRuntime(); 
    Process pr = rt.exec(cmd); 
    //pr.waitFor(); 

    // retrieve output from python script 
    BufferedReader bfr = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
    String line = ""; 
    while((line = bfr.readLine()) != null) { 
    // display each output line form python script 
    System.out.println(line); 
    } 
} 

public static void main(String args[]) throws IOException, InterruptedException { 
YelpPython demo = new YelpPython(); 
demo.pythonrun("dennys-san-jose-2"); 
} 

腳本(msp.py):

它能做什麼? (總之,該腳本都到了頁面和擦傷評論)

from bs4 import BeautifulSoup 
from urllib import urlopen 
import sys 
queries = 0 
while queries <201: 
    stringQ = sys.argv[1] 
    page = urlopen('http://www.yelp.com/biz/' + stringQ) 

    soup = BeautifulSoup(page) 
    reviews = soup.findAll('p', attrs={'itemprop':'description'}) 
    authors = soup.findAll('span', attrs={'itemprop':'author'}) 

    flag = True 
    indexOf = 1 

    for review in reviews: 
     dirtyEntry = str(review) 
     while dirtyEntry.index('<') != -1: 
      indexOf = dirtyEntry.index('<') 
      endOf = dirtyEntry.index('>') 
      if flag: 
       dirtyEntry = dirtyEntry[endOf+1:] 
       flag = False 
      else: 
       if(endOf+1 == len(dirtyEntry)): 
        cleanEntry = dirtyEntry[0:indexOf] 
        break 
       else: 
        dirtyEntry = dirtyEntry[0:indexOf]+dirtyEntry[endOf+1:] 
     f=open("reviews.txt", "a") 
     f.write(cleanEntry) 
     f.write("\n") 
     f.close 
    queries = queries + 40 

問題(簡言之):

當我運行通過命令行這個腳本,它的工作原理和它終於商店a reviews.txt文件。但是當我通過這個程序運行它時,什麼也沒有發生

我玩過pr.wait()和pr.waitfor(),但沒有任何反應。

請指教。

謝謝。

回答

1
public void pythonrun(String args) throws IOException, InterruptedException { 
    String pythonScriptPath = "/yelp/msp.py"; 
    String[] cmd = new String[2 + args.length()]; 
    cmd[0] = "C:\\Python27\\python.exe"; 
    cmd[1] = pythonScriptPath; 
    for(int i = 0; i < args.length(); i++) { 
     cmd[i+2] = args; 
    } 
    : 
} 

這看起來不太正確。你正在創建基於該的尺寸大小的字符串數組中傳遞

這意味着,pythonrun("1234")最終會執行:

C:\Python27\python.exe /yel/msp.py 1234 1234 1234 1234 

如果你只是想傳遞爲腳本一個參數,你會做這樣的事情:

public void pythonrun(String args) throws IOException, InterruptedException { 
    String pythonScriptPath = "/yelp/msp.py"; 
    String[] cmd = new String[3]; 
    cmd[0] = "C:\\Python27\\python.exe"; 
    cmd[1] = pythonScriptPath; 
    cmd[2] = args; 
    : 
} 

如果你想在陣列傳遞的參數,像這樣將賭注之三:

public void pythonrun(String [] args) throws IOException, InterruptedException { 
    String pythonScriptPath = "/yelp/msp.py"; 
    String[] cmd = new String[2 + args.length()]; 
    cmd[0] = "C:\\Python27\\python.exe"; 
    cmd[1] = pythonScriptPath; 
    for(int i = 0; i < args.length(); i++) { 
     cmd[i+2] = args[i]; 
    } 
    : 
} 

你可以告訴準確正在使用哪些參數的過程中通過將下面的代碼的代碼後,你將它們設置:

for (int i = 0; i < cmd.length(); i++) 
    System.out.println ("DEBUG " + i + ": [" + cmd[i] + "]"); 

除此之外,還有可能是您的命令行版本與Java程序中調用的版本之間的差異。

首先,您的Java程序正在調用/yelp/msp.py,而您的命令行版本直接調用msp.py。你確定你的msp.py腳本實際上是/yelp

還要確保C:\Python27\python.exe是正確的Python解釋器。

最後,在Java程序運行時檢查您所在的目錄。如果這不是你所期望的,你可能會在一個完全意想不到的地方創建reviews.txt

+0

你能幫我解決嗎?我只是想通過該字符串作爲參數。我如何修改這個腳本以適合我的需求?我正在通過「dennys-san-jose-2」或類似的東西。 –

+1

@Rocky,我給答案增加了兩種可能性,一種是如果你只想要一個參數,另一種是如果你想傳遞一個字符串數組。 – paxdiablo

+0

男人你是一個救星! 'SO'岩石!我會檢查並通知你! –

0
String python_script_path ="Path to Python script/"; 
ProcessBuilder pb = new ProcessBuilder("python","msp.py","parameter1","parameter2"); 
pb.directory(new File(python_script_path)); 
Process process = pb.start(); 
InputStream is = process.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br1 = new BufferedReader(isr); 
String line1; 
while ((line1 = br1.readLine()) != null) { 
System.out.println(line1); 
} 

使用的ProcessBuilder並設置路徑變量

+0

我想運行這個,但是當我使用/yelp/msp.py時,腳本本身給了我一個錯誤。我可以知道我當前的錯在哪裏嗎?因爲它適用於所有其他的Python腳本 –

+0

你正在得到什麼錯誤?你能提供日誌嗎? –

0

我設法找到了這個問題的解決,雖然我還是不明白這一點。

我使用了相同的代碼,它在Ubuntu上工作。

cmd[0] = "python"; 

這是我修改,我跑了相同的腳本和b00m和它的作品!

問題是爲什麼?