为什么我的Python程序在从Java调用时会失败?

时间:2014-02-05 04:06:59

标签: java python python-2.7 sympy

本质上我有这个程序:

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

2 个答案:

答案 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
...