我正在为我公司的内部工具包构建一个前端。一半的工具是用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脚本遇到任何错误,它就不会打印出来。我怎样才能确保它还打印出它有的任何错误?
答案 0 :(得分:5)
简单的回答是阅读Process.getErrorStream
。
更复杂的答案是你所谓的Python可能是指CPython,它只是该语言的一种实现。还有另一个实现,Jython,它基本上将Python编译成Java字节码,以便在JVM上运行。与只通过Java的Runtime.exec
P.S。 Runtime.exec
是一种旧的做事方式。 ProcessBuilder
通常是一种更清晰,更直观的方式来启动Java中的子流程。
答案 1 :(得分:0)
prevois的回答是好的,这里建议你发布Process的所有资源,例如:
Process process = null;
try{
//xxxx
}catch(xxx){
}finally{
if(process!=null){
process.destroy();
}
}
原因是如果你忘了销毁进程,涉及的文件处理程序会泄漏, 你会得到一个IOException最终显示太多打开的文件。