本质上我有这个程序:
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
答案 0 :(得分:2)
由于指定Python的完整路径可以修复您的问题,因此您很可能在系统上安装了多个Python。而不是PYTHONPATH
不同,我怀疑实际上PATH
是不同的。因此,您的命令行使用您想要的Python解释器,而Java则使用另一个。
要确定此备用安装的位置,which -a python
可能有用,但如果没有,请从Java代码中检查PATH
,看看是否可以在其中一个目录中找到Python。
无论如何,如果你真的需要在Java中指定完整的Python路径,你应该将它作为配置选项。在不同的机器上它可能会有所不同。将它存储在文件中似乎是最谨慎的。
答案 1 :(得分:1)
从Java上下文运行时,PYTHONPATH
(或不太可能是您的工作目录)是不同的。
你可以
import sys
print sys.path
可以帮助您确保两者的路径相同。
告诉我们更多关于如何设置环境的信息将有助于获得更具体的答案。
例如。也许Java是通过Web服务器运行的?
以下是修复路径问题的几种方法:
确保包含sympy
的目录位于您的PYTHONPATH
环境变量
如果你真的很绝望,请将正确的目录附加到sys.path
import sys
sys.append("/some/dir/with/sympy")
from sympy.solvers import solve
...