【发布时间】:2011-05-08 02:09:21
【问题描述】:
我需要从我的 Java 应用程序编译和运行用 Python、Pascal 或 C 编写的源代码(单个文件)。
我需要知道:
- 如果编译过程成功
- 编译程序的返回输出
我怎样才能做到这一点?
【问题讨论】:
标签: java compiler-construction
我需要从我的 Java 应用程序编译和运行用 Python、Pascal 或 C 编写的源代码(单个文件)。
我需要知道:
我怎样才能做到这一点?
【问题讨论】:
标签: java compiler-construction
我一直在做同样的事情..
public String compile()
{
String log="";
try {
String s= null;
//change this string to your compilers location
Process p = Runtime.getRuntime().exec("cmd /C \"C:\\Program Files\\CodeBlocks\\MinGW\\bin\\mingw32-g++.exe\" temp.cpp ");
BufferedReader stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
boolean error=false;
log+="\n....\n";
while ((s = stdError.readLine()) != null) {
log+=s;
error=true;
log+="\n";
}
if(error==false) log+="Compilation successful !!!";
} catch (IOException e) {
e.printStackTrace();
}
return log;
}
public int runProgram()
{
int ret = -1;
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("cmd.exe /c start a.exe");
proc.waitFor();
ret = proc.exitValue();
} catch (Throwable t)
{
t.printStackTrace();
return ret;
}
return ret;
}
这是在我的 MiDE 第一个用于编译的函数中使用的 2 个函数。将地址更改为您的编译器位置。并返回日志(以防编译失败)以查看错误。
第二个运行编译后的代码。返回退出代码以检查它是否正确终止。
我不是一个很好的 java coder 。我想您可以更好地改进我的代码;) .. 如果您这样做,请通知我。我也在寻找how to communicate with the created process的答案
【讨论】:
您可以使用 java.lang.ProcessBuilder 来执行命令并检查状态。 这里是 JAVADOC:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html
【讨论】:
一般来说,您需要启动一个运行外部程序的Process(首先是编译器,然后是编译后的二进制文件),使用Runtime.getRuntime().exec() 或ProcessBuilder 来生成@ 987654325@(因为您的编译器可能需要一组复杂的选项,所以ProcessBuilder 可能是更好的选择)。这将允许您在进程执行时获取其输出(因此您可以监视编译器输出是否有警告或错误)以及它的返回代码。
您可能会发现以下示例很有帮助:
http://www.rgagnon.com/javadetails/java-0014.html
要获得正在运行的Process 的返回码,只需使用waitFor() 方法。如果您不关心任何输出而只需要返回值,这会很方便。
【讨论】:
您可能想要使用Runtime.exec() 来调用相应的编译器。查看JavaDoc 了解有关如何处理输出等的更多信息。
【讨论】:
如果您主要编写代码 sn-ps,您可以尝试使用 Jython 运行 Python 代码。详情请见Howto multithreaded jython scripts running from java?。
【讨论】: