[IPython-dev] !commands in the zmq model
Gael Varoquaux
gael.varoquaux at normalesup.org
Sat Aug 28 08:51:56 EDT 2010
On Sat, Aug 28, 2010 at 12:29:53AM -0700, Fernando Perez wrote:
> We can interrupt subprocesses fine with our current
> (subprocess.Popen-based) implementation, but we can't get their output
> cleanly as it happens. So in the usual:
> for i in range(200):
> print i,
> sys.stdout.flush()
> time.sleep(0.01)
> print 'done!'
> We only see *all* the numbers at the very end. I haven't found any way
> around this with subprocess, and neither did our old ipythonx
> implementation done by Gael; as best as I understand popen it simply
> can't be done: in pipe mode, the C stdio library does block-buffered
> io on all process execution and there's no clean way I can find, to
> read from a pipe with a timeout.
Hum, I thought that I had it working. I can't test right now, but I seem
to remember I had spend quite a lot of time on that.
I am not claiming that my code was terribly good, ( :> "I write code, I
look at it a year later, I vomit", Michael A., CACR) but if I remember
correctly, there might be a few tricks to try and keep.
* For pure Python code, as your example above, the trick was to use what
I have called the 'RedirectorOutputTrap' that registers a callback on
writing to the sys.stdout/sys.stderr. It is implemented in
IPython.kernel.core.redirector_output_trap.
* For subprocesses, I had to resort to 2 threads, one executing the
process, the other polling its stdout (ugly). This logic can be found
in IPython.frontend.process.pipedprocess. It also adds a bit of logic
to be able to kill the process under Windows, which you might want to
keep in mind.
I am not sure if this code can be of some use to you or not, but just in
case. I believe that it might be one of the few useful things that came
out of my work. It actually even seems to have tests :$
Cheers,
Gaël
More information about the IPython-dev
mailing list