J
John O'Hagan
I'm starting a server process as a subprocess. Startup is slow and
unpredictable (around 3-10 sec), so I'm reading from its stdout until I get a
line that tells me it's ready before proceeding, in simplified form:
import subprocess
proc = subprocess.Popen(['server', 'args'], stdout=subprocess.PIPE)
while proc.stdout.readline() != "Ready.\n":
pass
Now I can start communicating with the server, but I eventually realised that
as I'm no longer reading stdout, the pipe buffer will fill up with output from
the server and before long it blocks and the server stops working.
I can't keep reading because that will block - there won't be any more output
until I send some input, and I don't want it in any case.
To try to fix this I added:
proc.stdout = os.path.devnull
which has the effect of stopping the server from failing, but I'm not convinced
it's doing what I think it is. If I replace devnull in the above line with a
real file, it stays empty although I know there is more output, which makes me
think it hasn't really worked.
Simply closing stdout also seems to stop the crashes, but doesn't that mean
it's still being written to, but the writes are just silently failing? In
either case I'm wary of more elusive bugs arising from misdirected stdout.
Is it possible to re-assign the stdout of a subprocess after it has started?
Or just close it? What's the right way to read stdout up to a given line, then
discard the rest?
Thanks,
john
unpredictable (around 3-10 sec), so I'm reading from its stdout until I get a
line that tells me it's ready before proceeding, in simplified form:
import subprocess
proc = subprocess.Popen(['server', 'args'], stdout=subprocess.PIPE)
while proc.stdout.readline() != "Ready.\n":
pass
Now I can start communicating with the server, but I eventually realised that
as I'm no longer reading stdout, the pipe buffer will fill up with output from
the server and before long it blocks and the server stops working.
I can't keep reading because that will block - there won't be any more output
until I send some input, and I don't want it in any case.
To try to fix this I added:
proc.stdout = os.path.devnull
which has the effect of stopping the server from failing, but I'm not convinced
it's doing what I think it is. If I replace devnull in the above line with a
real file, it stays empty although I know there is more output, which makes me
think it hasn't really worked.
Simply closing stdout also seems to stop the crashes, but doesn't that mean
it's still being written to, but the writes are just silently failing? In
either case I'm wary of more elusive bugs arising from misdirected stdout.
Is it possible to re-assign the stdout of a subprocess after it has started?
Or just close it? What's the right way to read stdout up to a given line, then
discard the rest?
Thanks,
john