Программа завершается без ошибок

1

Я пытаюсь запустить эту программу 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(), но ничего не происходит.

Пожалуйста посоветуй.

Спасибо.

Теги:
yelp

3 ответа

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-программы.

Во- /yelp/msp.py, ваша Java-программа вызывает /yelp/msp.py тогда как ваша версия командной строки вызывает msp.py напрямую. Вы уверены, что ваш скрипт msp.py самом деле находится в /yelp?

Также убедитесь, что C:\Python27\python.exe является правильным интерпретатором Python.

И, наконец, проверьте, в каком каталоге вы находитесь, когда запущена программа Java. Если это не то, что вы ожидаете, вы вполне можете создать reviews.txt в совершенно неожиданном месте.

  • 0
    Не могли бы вы помочь мне исправить это? Я просто пытаюсь передать эту строку в качестве аргумента. Как я могу изменить этот скрипт в соответствии со своими потребностями? Я прохожу "dennys-san-jose-2" или что-то подобное.
  • 1
    @Rocky, я добавил к ответу две возможности: одну, если вам нужен только один аргумент, и другую, если вы хотите передать массив строк.
Показать ещё 6 комментариев
0

Мне удалось найти решение для этого, хотя я все еще не понимаю.

Я использовал тот же код, и он работает на Ubuntu.

cmd[0] = "python";

Это все, что я изменил, и я запускал один и тот же скрипт и b00m, и он работает!

Вопрос: ПОЧЕМУ?

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
    какую ошибку вы получаете? Можете ли вы предоставить журнал

Ещё вопросы

Сообщество Overcoder
Наверх
Меню