3

私は Python を教える Web アプリを開発していますが、解決しなければならない問題の 1 つは、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 を読み取るよりも安定していると思います。これで、インタープリターが実行されているスレッドが 1 つあれば十分です。

于 2013-10-01T20:52:39.590 に答える