从Java调用Python代码时出现问题(不使用jython)

时间:2019-01-25 05:00:26

标签: java python python-3.x jython

我发现这是从Java运行(使用exec()方法)python脚本的方法之一。我在python文件中有一个简单的print语句。但是,我的程序在运行时什么也没做。它既不打印用python文件编写的语句,也不抛出异常。该程序只是终止不执行任何操作:

Process p = Runtime.getRuntime().exec("C:\\Python\\Python36-32\\python.exe C:\\test2.py");

即使这没有创建输出文件:

Process p = Runtime.getRuntime().exec("C:\\Python\\Python36-32\\python.exe C:\\test2.py output.txt 2>&1");

出了什么问题?

3 个答案:

答案 0 :(得分:1)

我认为您可以通过ProcessBuilder类尝试运气。

如果我正确阅读了Oracle文档,则默认情况下,std输入和输出直接定向到管道,但是, ProcessBuilder有一个简单的方法可以让您明确地set output (or input) to a file on your system or something else

如果您希望Python程序使用与Java程序相同的输出(可能是stdout和stderr),则可以这样使用stg:

ProcessBuilder pb = new ProcessBuilder("C:\\Python\\Python36-32\\python.exe", "C:\\test2.py");
pb.redirectOutput(Redirect.INHERIT);
Process p = pb.start();

答案 1 :(得分:1)

您可以使用ProcessBuilder API,将输出重定向到文件,然后等待结果。

public class Main {

    public static final String PYTHON_PATH = "D:\\Anaconda3\\python.exe";
    public static final String PATH_TO_SCRIPT = "D:\\projects\\StartScript\\test.py";

    public static void main(String[] args) throws IOException, InterruptedException {
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(PYTHON_PATH, PATH_TO_SCRIPT);

        // Redirect output to a file
        builder.redirectOutput(new File("output.txt"));

        builder.start().waitFor();

        // Print output to console
        ProcessBuilder.Redirect output = builder.redirectOutput();
        File outputFile = output.file();
        BufferedReader br = new BufferedReader(new FileReader(outputFile));

        String st;
        while ((st = br.readLine()) != null) {
            System.out.println(st);
        }

    }
}

python文件test.py包含一个简单的打印语句:

print("Hello from python")

如果您不需要等待结果,我想它甚至会更简单。

使用Process API也应该起作用。

就像您的示例一样(我使用的是上面声明的常量):

Process p = Runtime.getRuntime().exec(PYTHON_PATH + " " + PATH_TO_SCRIPT);
p.waitFor();

byte[] buffer = new byte[1024];
byte[] errBuffer = new byte[1024];

p.getInputStream().read(buffer);
p.getErrorStream().read(errBuffer);

System.out.println(new String(buffer));
System.out.println(new String(errBuffer));

要查看print语句的输出,您需要等待并重定向流。错误流也一样。

现在,如果您像这样破坏python脚本:

print("Hello from python')

您还应该能够看到打印出的错误。

答案 2 :(得分:0)

启动python进程的一种方法是使用入口点-test.cmd

echo Hello
python hello.py

这是hello.py

#!/usr/bin/env python3
import os
if not os.path.exists('dir'):
    os.makedirs('dir')

这是我的Java代码:

public static void main(String[] args) throws IOException {
    try {
        Process p = Runtime.getRuntime().exec("test.cmd");
        p.waitFor();
        Scanner sc = new Scanner(p.getInputStream());
        while(sc.hasNextLine()){
            System.out.println(sc.nextLine());
        }
        sc.close();
    } catch (Exception err) {
        err.printStackTrace();
    }
}