Я пытаюсь запустить эту программу Python в Java.
Проблема: когда я запускаю эту программу из командной строки: Python msp.py dennys-san-jose-2 - it 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
Проблема (Короче говоря):
Когда я запускаю этот скрипт через командную строку, он работает, и он, наконец, сохраняет файл review.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-программы.
Во- /yelp/msp.py
, ваша Java-программа вызывает /yelp/msp.py
тогда как ваша версия командной строки вызывает msp.py
напрямую. Вы уверены, что ваш скрипт msp.py
самом деле находится в /yelp
?
Также убедитесь, что C:\Python27\python.exe
является правильным интерпретатором Python.
И, наконец, проверьте, в каком каталоге вы находитесь, когда запущена программа Java. Если это не то, что вы ожидаете, вы вполне можете создать reviews.txt
в совершенно неожиданном месте.
Мне удалось найти решение для этого, хотя я все еще не понимаю.
Я использовал тот же код, и он работает на Ubuntu.
cmd[0] = "python";
Это все, что я изменил, и я запускал один и тот же скрипт и b00m, и он работает!
Вопрос: ПОЧЕМУ?
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 и задайте переменные пути