 <p>Both <code>call</code> and <code>Popen</code> provide means of accessing the output of your command:</p> <ul> <li>With <code>Popen</code> you can use <code>communicate</code> or provide a file descriptor or file object to the <code>stdout=...</code> parameter.</li> <li>With <code>call</code> your only option is to pass a file descriptor or a file object to the <code>stdout=...</code> parameter (you can not use <code>communicate</code> with this one).</li> </ul> <p>Now, the reason why <code>stdout=PIPE</code> is insecure when used with <code>call</code> is because <code>call</code> doesn't return until the subprocess has finished, this means all the output would have to reside in memory until that moment, and if the amount of output is too much then that would fill the OS pipes' buffer.</p> <p>The references where you can validate the above information are the following:</p> <ol> <li>According to <a href="https://docs.python.org/2/library/subprocess.html#subprocess.call" rel="nofollow">this</a> the parameters for both <code>call</code> and <code>Popen</code> are the same:</li> </ol> <blockquote> <p>The arguments shown above are merely the most common ones, described below in Frequently Used Arguments (hence the slightly odd notation in the abbreviated signature). The full function signature is the same as that of the Popen constructor - this functions passes all supplied arguments directly through to that interface.</p> </blockquote> <ol start="2"> <li>According to <a href="https://docs.python.org/2/library/subprocess.html#subprocess.Popen" rel="nofollow">this</a> the possible values for the <code>stdout</code> parameter are:</li> </ol> <blockquote> <p>Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created</p> </blockquote>