4

我正在为我公司的内部工具包构建一个前端。一半的工具是用 python 编写的,另一半是用其他几种脚本语言编写的。所以我正在使用swing在java中构建一个前端。到目前为止,我可以通过以下代码调用 python 脚本:

public class Foo
{
    public static void main(String[] args)
    {
        try
        {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec("python foo.py");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            p.waitFor();
            String line = "";
            while (br.ready())
                System.out.println(br.readLine());

        }
        catch (Exception e)
        {
        String cause = e.getMessage();
        if (cause.equals("python: not found"))
            System.out.println("No python interpreter found.");
        }
    }
} 

效果很好,但是如果 python 脚本遇到任何错误,它就不会打印出来。我怎样才能确保它也打印出它有的任何错误?

4

2 回答 2

5

简单的答案是也阅读Process.getErrorStream

更复杂的答案是,您所说的 Python 可能是指 CPython,它只是该语言的一种实现。还有另一个实现,Jython,它基本上将 Python 编译成 Java 字节码,以便在 JVM 上运行。这将允许更紧密的集成,而不是简单地通过 Java 调用 CPythonRuntime.exec

PSRuntime.exec是一种古老的做事方式。ProcessBuilder在 Java 中启动子进程通常是一种更简洁、更直观的方式。

于 2013-03-20T04:26:53.840 回答
0

prevois 的答案是好的,这里建议您应该释放 Process 的任何资源,例如:

        Process process = null;
    try{
        //xxxx
    }catch(xxx){

    }finally{
        if(process!=null){
            process.destroy();
        }
    }

原因是如果你忘记销毁进程,涉及的文件处理程序会泄漏,你最终会得到一个 IOException 显示打开的文件太多。

于 2013-03-20T04:37:07.710 回答