<br><div class="gmail_quote">On Tue, Feb 22, 2011 at 3:44 PM, Rita <span dir="ltr"><<a href="mailto:rmorgan466@gmail.com">rmorgan466@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I have a process like this,<br><br>def run(cmd):<br>  #cmd=a process which writes a lot of data. Binary/ASCII data<br>  p=subprocess.Popen(cmd,stdout=subprocess.PIPE)<br><br>I would like to get cmd's return code so I am doing this,<br>

<br>def run(cmd):<br>  p=subprocess.Popen(cmd,stdout=subprocess.PIPE)<br>  rc=p.poll()<br>  print rc # and I get 'None' regardless of what cmd gives me (0 thru 255 are valid return codes)<br>  return p.stdout<br>
</blockquote><div><br></div><div>Here, you are accessing the return code, however the process has not exited yet, and thus you get None.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
<br>When using wait() it works a bit better but not consistent<br>def run(cmd):<br>  p=subprocess.Popen(cmd,stdout=subprocess.PIPE)<br>  rc=p.wait()<br>  print rc<br>  return p.stdout<br><br>When the output of cmd is a small ascii file it works perfectly fine, but when the file is large (more than 2MB) the process just waits for ever (I am guessing its blocking?).  When I use the communicate call it works perfectly but my process is consuming way too much memory.  </blockquote>
<div><br></div><div>Here, you wait for the process to exit, with wait returning the exit code. As you have waited for the process, it has exited and thus you get the return code.</div><div><br></div><div>The issue here is that the stdout pipe has a limited size, and the process will block once the pipe becomes full. You are entering a dead-lock as the pipe is full, and thus the sub process is blocking waiting for room to write more output. As nothing is reading that output, that will never happen. It works fine on smaller output as you don't hit the limit. See the warning on <a href="http://docs.python.org/library/subprocess.html#popen-objects">http://docs.python.org/library/subprocess.html#popen-objects</a> under wait.</div>
<div><br></div><div>.communicate works as it reads the output, however it eats up memory as all of the data has to be buffered in memory.</div><div><br></div><div>A possible work around would be to redirect the output into a file rather than to a pipe (see the comments about stdin, stdout and stderr at <a href="http://docs.python.org/library/subprocess.html#using-the-subprocess-module">http://docs.python.org/library/subprocess.html#using-the-subprocess-module</a>). In this way, the data will be buffered to a file rather than memory.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>Is there a better way to get my return code consistently efficiently and not take up so much memory? <br><font color="#888888"><br><br><br><br><br><br clear="all"><br>-- <br>--- <span>Get your facts first, then you can distort them as you please.</span>--<br>


</font><br>--<br>
<a href="http://mail.python.org/mailman/listinfo/python-list" target="_blank">http://mail.python.org/mailman/listinfo/python-list</a><br>
<br></blockquote></div><br>