使用ProcessBuilder / RunTime从java调用easy_install应用程序

问题描述 投票:0回答:1

标题并没有真正解释我的问题,但我不知道如何更好地问它。所以,基本上,我正在编写一个使用程序li​​vestreamer的应用程序。我使用:easy_install -U livestreamer将它安装在我的Mac上。到目前为止,这很好,当我在终端上写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,它输出没有任何问题。这是我第一次搞乱这类东西,所以我的错误可能是一个非常新手。在此先感谢您的帮助!

java macos
1个回答
1
投票

livestreamer不在Java进程的路径中。

每个Windows和Unix操作系统的执行环境都有一个程序路径的概念。该路径是一个环境变量(在除Windows之外的所有操作系统中都命名为PATH,它使用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。)

© www.soinside.com 2019 - 2024. All rights reserved.