Вызовите приложения easy_install из Java с помощью ProcessBuilder / RunTime - PullRequest
0 голосов
/ 19 марта 2019

Название действительно не объясняет мой вопрос, но я не знаю, как задать его лучше. Итак, в основном, я пишу приложение, которое использует программу livestreamer. Я установил его на свой Mac, используя: easy_install -U livestreamer. Пока все хорошо, это работает, когда я пишу livestream на моем терминале. Теперь моя проблема в том, что когда я пытаюсь вызвать его на Java:

    public static void runLiveStreamer(String channel, String quality) throws IOException{


    String[] cmd  = new String[]{"livestreamer", "twitch.tv/"+channel, quality};
    Process proc = Runtime.getRuntime().exec(cmd);
    InputStreamReader isr = new InputStreamReader(proc.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    String line=null;
    while ( (line = br.readLine()) != null)
        System.out.println(line);    
}

Я получаю эту ошибку:

Exception in thread "main" java.io.IOException: Cannot run program "livestreamer": error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at java.base/java.lang.Runtime.exec(Runtime.java:591)
at java.base/java.lang.Runtime.exec(Runtime.java:450)
at livestream.runLiveStreamer(livestream.java:12)

Я знаю, что код работает, потому что если я заменю String[] cmd = new String[]{"livestreamer", "twitch.tv/"+channel, quality};, например, ls, он выдаст без проблем. Это мой первый раз, когда я возился с подобными вещами, поэтому моя ошибка, вероятно, действительно новичок. Заранее спасибо за помощь!

1 Ответ

1 голос
/ 19 марта 2019

livestreamer не находится в пути вашего Java-процесса.

В каждой среде выполнения операционной системы Windows и Unix есть концепция пути программы.Путь является переменной среды (с именем PATH во всех операционных системах, кроме Windows, которая использует Path).Он содержит список каталогов, разделенных двоеточиями :, за исключением Windows, где они разделены точками с запятой (;).

Как и для любой переменной среды, каждый запущенный процесс может иметь свой собственный путьопределены, и дочерние процессы обычно наследуют его от своего родительского процесса.

Всякий раз, когда вы пытаетесь запустить программу без каких-либо разделителей каталогов (например, пытаясь запустить ls вместо /bin/ls), система будетищите эту программу в каждом каталоге в пути.

В вашем терминале ваш PATH содержит каталог, в котором есть livestream.Когда вы запускаете Java-процесс, у вас есть другой PATH, в который не входит каталог, содержащий livestream.

Самое простое решение - обратиться к livestream по его абсолютному имени файла, таким образом делаясистемный путь выполнения не имеет значения:

String[] cmd  = { "/usr/bin/livestreamer", "twitch.tv/" + channel, quality };

/usr/bin/livestreamer является лишь примером.Я не знаю, где на самом деле был установлен livestreamer в вашей системе.

Чтобы найти его, выполните which livestreamer в своем терминале.Это должно сказать вам абсолютное местоположение этого.(Я думаю, что в Windows команда будет where livestreamer.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...