<p>所以在快速阅读了<a href="http://docs.python.org/2/library/subprocess.html" rel="nofollow">the docs</a>之后,我发现了以下两个句子:</p>
<blockquote>
<p>On Unix, if args is a string, the string is interpreted as the name or
path of the program to execute</p>
</blockquote>
<p>以及</p>
<blockquote>
<p>The shell argument (which defaults to False) specifies whether to use
the shell as the program to execute. If shell is True, it is
recommended to pass args as a string rather than as a sequence.</p>
</blockquote>
<p>基于此,我建议将命令重新创建为列表:</p>
<pre><code>command = ["tcpflow -c", "-i any port 5559"] #I don't know linux, so double check this line!!
</code></pre>
<p>总的想法是这样的(同样来自文档):</p>
<blockquote>
<p>If args is a sequence, the first item specifies the command string,
and any additional items will be treated as additional arguments to
the shell itself. That is to say, Popen does the equivalent of:</p>
</blockquote>
^{pr2}$
<hr/>
<p><strong>另外,</strong>似乎要从进程中读取,应该使用<code>communicate()</code>。所以</p>
<pre><code>while True:
line = port_sniffer.stdout.readline()
</code></pre>
<p>会变成</p>
<pre><code>while True:
line = port_sniffer.communicate()[0]
</code></pre>
<p>但请记住文件中的以下注释:</p>
<blockquote>
<p><strong>Note</strong> The data read is buffered in memory, so do not use this method if the data size is large or unlimited.</p>
</blockquote>