gpt4 book ai didi

java进程构建器添加路径到环境不起作用

转载 作者:行者123 更新时间:2023-11-30 10:35:17 24 4
gpt4 key购买 nike

我在使用 processbuider 添加到进程环境的路径时遇到问题。我不知道为什么这个过程忽略了环境。这是我的例子:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;


public class main {

public static void main(String [ ] args) {
try {
String s = null;


ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "fsl");
Map<String, String> env;
env = pb.environment();
env.put("FSLDIR", "/usr/local/fsl/bin/");

Process p = pb.start();

BufferedReader stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));

BufferedReader stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));

System.out.println("Process p:");

// read the output from the command
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}

//////////*********\\\\\\\\\\\

ProcessBuilder pb2 = new ProcessBuilder("/usr/local/fsl/bin/fsl");

s = null;
Process p2 = pb2.start();

stdInput = new BufferedReader(new
InputStreamReader(p2.getInputStream()));

stdError = new BufferedReader(new
InputStreamReader(p2.getErrorStream()));

System.out.println("Process p2:");

// read the output from the command
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}

} catch (Exception e) {
e.printStackTrace();
}


}
}

输出:

Process p:

/bin/bash: fsl: command not found

Process p2:

DISPLAY is not set. Please set your DISPLAY environment variable!

而且您看到 FSL 想要设置更多变量。这就是为什么 p2 不是一个选项。

最佳答案

正如 Jdamian 所说,Bash 搜索 PATH environment variable 中的目录查找二进制文件 - Bash 不会查找您的 FSLDIR 变量,也不会将任意变量的值视为可执行文件。

当进程库(例如 Java 中的 ProcessBuilder,Python 中的 subprocess)遇到问题时,您应该始终做的第一件事就是尝试直接复制问题在外壳中。如果您在 shell 中运行 fsl/bin/bash -c fsl,您可能会看到相同的错误(如果您不这样做,则说明您没有运行 Java二进制方式与您的 shell 相同)确认问题与 Java 无关。

一旦您确认这只是一个如何修复它的问题。如果您想让 fsl 始终可用,请将其包含目录添加到您的 ~/.bashrc 文件中的 PATH 中:

export PATH="$PATH:/usr/local/fsl/bin"

如果您只想在您的 Java 二进制文件中使用它,请修改进程中的 PATH:

// notice there's no need for `bash -c`
ProcessBuilder pb = new ProcessBuilder("fsl");
pb.environment().put("PATH",
"/usr/local/fsl/bin" + File.pathSeparator + System.getenv("PATH"));

但是在实践中,如果您不修改 PATH 而只是简单地始终通过绝对路径调用外部进程,例如您的第二个示例:

ProcessBuilder pb = new ProcessBuilder("/usr/local/fsl/bin/fsl");

这两个命令(大致)等同,但后者更清晰,并且不太可能引入令人困惑的错误。

关于java进程构建器添加路径到环境不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41263358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com