擅长:python、mysql、java
<p>这样做,您需要<code>shell=True</code>来允许shell重定向工作。</p>
<pre><code>subprocess.call('sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout,shell=True)
</code></pre>
<p>更好的方法是:</p>
<pre><code>with open(outpath+fnameout,'w') as fout: #context manager is OK since `call` blocks :)
subprocess.call(cmd,stdout=fout)
</code></pre>
<p>这样可以避免同时生成一个shell,并且可以避免shell注入类型的攻击。这里,<code>cmd</code>是一个列表,如原始列表</p>
<pre><code>cmd = 'sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout
cmd = cmd.split()
</code></pre>
<p>还应该说明的是,python有非常好的排序工具,因此我怀疑实际上有必要通过子流程将作业传递给<code>sort</code>。</p>
<hr/>
<p>最后,与其使用<code>str.split</code>从字符串中拆分参数,不如使用<code>shlex.split</code>,因为这样可以正确处理带引号的字符串。</p>
<pre><code>>>> import shlex
>>> cmd = "foo -b -c 'arg in quotes'"
>>> print cmd.split()
['foo', '-b', '-c', "'arg", 'in', "quotes'"]
>>> print shlex.split(cmd)
['foo', '-b', '-c', 'arg in quotes']
</code></pre>