2013-10-01 82 views
2

我正在开发一个用于教学Python的Web应用程序,我必须解决的一个问题是如何从Jython解释器中捕获标准输出,这一点在补充的时候就已经解决了。正确捕获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

您是否尝试过调用exec并从不同线程的OutputStream中读取数据? – SimonC

+0

不,我没有。我有这样的想法,我可以创建自己的OutputStream类,不管写到它的数据库都会不择手段地提交到数据库,但是我希望避免它,因为有足够的方法可以阻止我这样做。还有PythonInterpreter.setOut(PyObject outStream)方法,但我不确定如何使用它。 – Passiday

+1

查看http://docs.oracle.com/javase/7/docs/api/java/io/PipedOutputStream.html,如果您要从另一个线程的输出流中读取数据,您将使用它。请记住,在同一个线程中写入数据库可能会导致你的python代码被阻塞(当然这可能是可以接受的)。 – SimonC

回答

1

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