本质上我有这个程序:
from sympy.solvers import solve
from sympy import Symbol
x = Symbol('x')
print solve(x**2 - 1, x)
我从 Java 中调用它使用此代码:
public static BufferedReader runFile(Class<?> c, String py, List<String> args) {
String cmd = c.getResource(py).getPath();
cmd=cmd.split(py)[0];
cmd=cmd.substring(0,cmd.length()-1);
args.add(0, py);
args.add(0, "python");
final ProcessBuilder pb = new ProcessBuilder(args);
new ProcessBuilder();
pb.directory(new File(cmd));
pb.redirectError();
try {
System.out.println(pb.directory().getPath());
for(String s:pb.command()){
System.out.println(s);
}
Process p=pb.start();
return new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
catch (final IOException e) {
throw new RuntimeException(e);
}
}
当我从终端运行 Python 程序时,一切都按预期工作,错误流中没有任何内容,并打印 [-1,1]。但是如果我从程序中运行它,我会在错误流中得到这个:
Traceback (most recent call last):
File "solve.py", line 1, in <module>
from sympy.solvers import solve
ImportError: No module named sympy.solvers
最佳答案
由于指定 Python 的完整路径可以解决您的问题,您很可能在系统上安装了多个 Python。而不是 PYTHONPATH
不同,我怀疑实际上是 PATH
不同。因此,您的命令行使用您想要的 Python 解释器,而 Java 使用另一个解释器。
要确定此备用安装位置,which -a python
可能有用,但如果没有用,请检查 Java 代码内部的 PATH
并查看是否可以找到Python 在其中一个目录中。
无论如何,如果您确实需要在 Java 中指定完整的 Python 路径,您应该将其设为配置选项。它可能会在不同的机器上有所不同。将其存储在文件中似乎是最谨慎的做法。
关于java - 为什么从 Java 调用我的 Python 程序会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568446/