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

为什么我的Python程序在从Java调用时失败?,java,python,python-2.7,sympy,Java,Python,Python 2.7,Sympy,本质上,我有这个计划: from sympy.solvers import solve from sympy import Symbol x = Symbol('x') print solve(x**2 - 1, x) 我用这个代码称之为: public static BufferedReader runFile(Class<?> c, String py, List<String> args) { String cmd = c.getResource(py).

本质上,我有这个计划:

from sympy.solvers import solve
from sympy import Symbol
x = Symbol('x')
print solve(x**2 - 1, x)
我用这个代码称之为:

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);
    }
}
publicstaticbufferedreader运行文件(c类,字符串py,列表参数){
字符串cmd=c.getResource(py).getPath();
cmd=cmd.split(py)[0];
cmd=cmd.substring(0,cmd.length()-1);
参数添加(0,py);
args.add(0,“python”);
最终ProcessBuilder pb=新ProcessBuilder(args);
新的ProcessBuilder();
pb.directory(新文件(cmd));
重定向错误();
试一试{
System.out.println(pb.directory().getPath());
for(字符串s:pb.command()){
系统输出打印项次;
}
进程p=pb.start();
返回新的BufferedReader(新的InputStreamReader(p.getErrorStream());
}
捕获(最终IOE例外){
抛出新的运行时异常(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
回溯(最近一次呼叫最后一次):
文件“solve.py”,第1行,在
从sympy.solvers导入求解
ImportError:没有名为sympy.solvers的模块

从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
...

由于指定Python的完整路径可以解决您的问题,因此您的系统上很可能有多个Python安装。与其说PYTHONPATH不同,我怀疑实际上是路径不同。因此,您的命令行使用您想要的Python解释器,而Java使用另一个

要确定此备用安装的位置,
which-a python
可能有用,但如果没有,请从Java代码内部检查
PATH
,看看是否可以在其中一个目录中找到python


无论如何,如果您确实需要在Java中指定完整的Python路径,那么应该将其作为一个配置选项。在不同的机器上可能会有所不同。将其存储在文件中似乎是最谨慎的。

您使用的是virtualenv或类似的软件吗?@jpmc26不确定这是什么,但不是。我使用的是原始java 7和python 2.7。与Symphy一起安装。您是否在全球范围内安装了Symphy?如何,如果是的话?@jpmc26我使用了pip install symphy。脚本是一样的,但我想知道您是否有多个版本的解释器,而这些版本无法找到彼此的软件包。如果在命令行和Java中指定完整的解释器路径会怎么样。。。另外,为了再次检查,它们都在同一台机器上;对吧?我不认为是问题所在。Python将全局
站点包
添加到
sys.path
中,无论您是否设置了
PYTHONPATH
。除非有什么方法可以改变这种行为?(我确信virtualenv做了一些有趣的事情,但这并不起作用。)不过,检查
sys.path
不会有什么坏处。@jpmc26,据我所知,OP甚至可能正在运行一个完全不同的Python解释器实例。这个模块可能找不到的原因只有几个,但是如果没有海报上的更多输入,就很难猜测了。好吧,PYTHONPATH是不同的。是否有一种方法可以解决模块不存在的问题。您可能可以使用
PYTHONPATH
使其使用其他Python站点包,但这可能会导致问题,特别是如果您也使用编译模块,或者Python版本不同(即使是很小的差异)。将路径设置为正确的是一个更好的主意。