[Tutor] subprocess and signals
Noufal Ibrahim
noufal at airtelbroadband.in
Tue Aug 7 21:23:09 CEST 2007
Eric Brunson wrote:
> Noufal Ibrahim wrote:
[..]
>> def createSignalDelegator(p):
>> def sighandler(signal,frame,pmake = p):
>> os.kill(pmake.pid,signal)
>> return sighandler
>>
>> pmake = subprocess.Popen(pmake_cmd, bufsize = 1, stdout =
>> subprocess.PIPE, stderr = subprocess.STDOUT)
>>
>> signal.signal(signal.SIGINT,createSignalDelegator(pmake))
>> signal.signal(signal.SIGQUIT,createSignalDelegator(pmake))
>> for op in pmake.stdout:
>> print "-- %s"%str(op).strip()
>> ------------------------------------------------------------------
>>
[..]
> I'm not an expert on the subprocess module, but I've used it a bit and
> I'm referring to the docs as I write this.
>
>> 1. I don't see any output (from my 'build') on screen when I run my
>> wrapper.
>>
>
> Why do you think you should? You've asked subprocess to pipe its output
> you your parent process, I believe you would need to use the
> communicate() method to get the output generated by the subprocess.
If I read from the stdout attribute of the Popen object, I should get
the output of the pipe. Shouldn't I? That's what I'm trying to do. I
think the code above is broken though so I've changed the last two lines
of the snippet to look like this
line = pmake.stdout.readline()
while line:
print "-- %s"%str(line).strip()
line = pmake.stdout.readline()
That sounds more sensible. The docs for communicate warn against using
it when the data size is large and that's the case here. I did however
try it like so
(stdout,dummy) = pmake.communicate()
line = stdout.readline()
while line:
print "-- %s"%str(line).strip()
line = stdout.readline()
and I get similar behaviour.
>> 3. I sometimes get a pipe error and the whole wrapper dies leaving the
>> other program running.
>>
>
> Exact error messages help a lot. :-)
Yeah I know. I didn't have access to the machine where I got the
original error so I thought I'd slur around there a bit. :)
But I got it now (this is with the original snippet).
Traceback (most recent call last):
File "./build_wrapper.py", line 246, in <module>
main()
File "./build_wrapper.py", line 231, in main
run_pmake(target,options,extra_flags,pmake_options)
File "./build_wrapper.py", line 209, in run_pmake
line = pmake.stdout.readline()
IOError: [Errno 4] Interrupted system call
This is with python2.4 (if that's useful). Also, the output of the
actual program will be a bit slow (since it's doing compiles and stuff).
Will some intermediate buffering create any trouble?
Thanks.
--
~noufal
More information about the Tutor
mailing list