从Java调用python

从Java调用python,java,python,Java,Python,我正在为公司的内部工具包构建前端。一半的工具是用python编写的,另一半是用其他几种脚本语言编写的。因此,我正在使用swing构建java前端。到目前为止,我可以通过以下代码调用python脚本: public class Foo { public static void main(String[] args) { try { Runtime r = Runtime.getRuntime(); Pr

我正在为公司的内部工具包构建前端。一半的工具是用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脚本遇到任何错误,它不会打印出来。如何确保它也打印出它的任何错误?

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

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


p.S.
Runtime.exec
是一种古老的做事方式
ProcessBuilder
通常是在Java中启动子进程的一种更干净、更直观的方法。

前面的答案是可以的,这里有一个建议,您应该释放任何进程资源,例如:

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

    }finally{
        if(process!=null){
            process.destroy();
        }
    }
原因是,如果您忘记销毁进程,则涉及的文件处理程序会泄漏,
最后,您将看到一个IOException,显示太多打开的文件。

所有这些的要点是与Java前端进行非常松散的集成,因为工具总是在不断变化和发展。谢谢你的解决方案,尽管这正是我所需要的。这篇令人难以置信的老文章与你的需求惊人地相关。