James wrote: > Hi, > > I have a snippet of code in a Python script I'm whipping up that's > causing a not-so-pretty output. Here's the code: > > subprocess.call( "yes '' | make oldconfig" , shell=True ) > > When I run this code, Python loyally executes the command, and then I > see the following error on my console: > > ----- > > yes: standard output: Broken pipe > yes: write error > > Thoughts / ideas?
File this one under 'wicked scary hack', but my first thought would be to redirect stderr of 'yes' to /dev/null, while preserving stderr of 'make oldconfig'. Something like this: import subprocess as sp sp.call("yes '' 2> /dev/null | make oldconfig", shell=True) ... or ... import subprocess as sp p1 = sp.Popen("yes ''", shell=True, stdout=sp.PIPE, stderr=file('/dev/null', 'w')) p2 = sp.Popen('make oldconfig', shell=True, stdin=p1.stdout) However, since the 'equivalent' shell command doesn't seem to result in a broken pipe error there must be a better way. Upon further inspection: $ strace yes 'Spam' | head -n 10 <...> --- SIGPIPE (Broken pipe) @ 0 (0) --- +++ killed by SIGPIPE +++ <...> We may need to handle SIGPIPE. A quick search leads here: http://article.gmane.org/gmane.comp.python.devel/88798/ ... so, thanks to Mr. Woodcraft ... import subprocess as sp import signal # warning: uses the system default action # for SIGPIPE for all children, use subprocess # preexec_fn arg if this is not desirable signal.signal(signal.SIGPIPE, signal.SIG_DFL) sp.call("yes 'Spam' | head -n 10", shell=True) HTH, Marty _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor