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

标签 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

最佳答案

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

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

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

关于java - 为什么从 Java 调用我的 Python 程序会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568446/

相关文章:

java - 如何使用 chrome、firefox 或任何浏览器的所有相同公钥/证书创建 SSLEngine?

java - 从Android 2.1瞄准Android 1.6平台

python - 使用 MoviePy 时出现类型错误

Python单元测试如何断言消息格式

python - 在 python 中创建 32 位浮点 wav 文件?

java - Minecraft Java Minecraft.getMinecraft 无法解析为类型

java - Idea 中无法查看应用程序服务器

python - 为什么 go build 找不到 Py_None?

python - 如何使用 networkx 从 Twitter 数据构建图表

python date time 获取当前时间,但包含秒和小时和分钟