我正在开发一个用于教授Python的Web应用程序,我必须解决的一个问题是如何从Jython解释器中获取标准输出,一直补充。
目前我在StringBuilder
对象中捕获输出,但这种方法只允许我在代码运行完毕时获取输出:
PythonInterpreter interp = new PythonInterpreter(null, new PySystemState());
StringWriter out = new StringWriter();
interp.setOut(out);
interp.exec(pyScript);
String outputStr = out.toString();
我想要的是,在从浏览器收到可运行代码之后,解释器继续在后台运行。如果代码运行需要时间,但输出被捕获并存储在数据库中,则让Ajax代码不断接收有关输出内容的更新。
答案 0 :(得分:1)
Man,编写我自己的OutputStream实现结果是最佳选择。只需实现write()和flush()方法就足够了。有点像这样:
public class DBOutputStream extends OutputStream
{
private String buffer;
private DBConnClass db;
public DBOutputStream (DBConnClass dbConn)
{
buffer = "";
db = dbConn;
}
public void write(int b)
{
byte[] bytes = new byte[1];
bytes[0] = (byte) (b & 0xff);
buffer = buffer + new String(bytes);
if (buffer.endsWith("\n"))
{
buffer = buffer.substring (0, buffer.length () - 1);
flush ();
}
}
public void flush()
{
// Commit the buffer to db here
buffer = "";
}
}
我想这比从另一个线程读取OutputStream更稳定。现在只有一个线程就足够了,即运行解释器的线程。