<p>您不是在尝试运行一个命令,而是运行一个包含多个命令的shell管道,并且您试图在不调用shell的情况下运行它。那不可能奏效。这样做的方式,<code>|</code>只是<code>find</code>的一个参数,这就是为什么{<cd2>}告诉你它不理解带有“paths must before expression:|”错误的参数。在</p>
<p>你可以把它加起来。在</p>
<p>但是一个更好的解决方案是用Python编写管道,并将shell排除在外。请参见文档中的<a href="http://docs.python.org/2/library/subprocess.html#replacing-older-functions-with-the-subprocess-module" rel="nofollow">Replacing Older Functions with the ^{<cd6>} Module</a>以获取解释,但我将展示一个示例。在</p>
<p>同时,不应该使用<code>split</code>来拆分命令行。最好的解决方案是编写单独的参数列表,而不是将它们连接成字符串,只是为了将它们分开。如果必须这样做,请使用<code>shlex</code>模块;这就是它的用途。但在您的情况下,即使这样也帮不了您,因为您逐字插入随机字符串,其中可能很容易包含空格或引号,而且任何-<code>shlex</code>或其他方法都无法首先重建数据。在</p>
<p>所以:</p>
<pre><code>pfind = Popen(['find', root, '-iname', '*.css'], stdout=PIPE)
pxargs = Popen(['xargs', 'sed', '-i', 's/[Ff][Oo][Oo]/bar/g'],
stdin=pfind.stdout, stdout=PIPE)
pfind.stdout.close()
output = pxargs.communicate()
</code></pre>
<hr/>
<p>但这里还有更好的解决方案。在</p>
<p>Python有<code>os.walk</code>来做与<code>find</code>相同的事情,您可以很容易地模拟<code>xargs</code>,但实际上没有必要这样做,而且它有自己的<code>re</code>模块来代替<code>sed</code>。那么,为什么不使用它们呢?在</p>
<p>或者,相反地,bash在驱动和连接简单命令方面比Python好得多,因此,如果您宁愿使用<code>find</code>和{<cd14>},而不是{<cd10>}和<code>re.sub</code>,那么为什么首先用Python编写驱动脚本呢?在</p>