3

我正在开发一个用于教授 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 代码不断接收有关输出内容的更新。

4

1 回答 1

2

伙计,编写我自己的 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 更稳定。现在只有一个线程就足够了,即解释器正在运行的线程。

于 2013-10-01T20:52:39.590 回答