我正在尝试在Java中运行这个Python程序。
问题:当我从命令行运行这个程序: Python msp.py dennys-san-jose-2 – 它工作
当我通过这个Java程序调用相同的脚本。 它只是终止。 我testing了其他的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
问题(简称):
当我通过命令行运行这个脚本时,它会起作用,并最终存储一个reviews.txt文件。 但是当我通过这个程序运行时,什么也没有发生。
我玩过pr.wait()和pr.waitfor(),但没有任何反应。
请指教。
谢谢。
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
msp.py
吗?
还要确保C:\Python27\python.exe
是正确的Python解释器。
最后,在Java程序运行时检查你所在的目录。 如果这不是你所期望的,你可能会在一个完全意想不到的地方创建reviews.txt
。
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并设置路径变量
我已经设法找到这个解决方案,但我仍然不明白。
我使用相同的代码,它在Ubuntu上工作。
cmd[0] = "python";
这是所有我修改,我运行相同的脚本和B00M,它的工作原理!
问题是为什么?