擅长:python、mysql、java
<p>如果可能的话,正确的做法是进行变量替换。事实上,首先不要使用外壳。您真正想要的是传递<code>grep</code>一个参数;您需要通过变量替换来完成此操作的唯一原因是您没有运行<code>grep</code>,而是在运行一个shell,并试图找出如何让它以您想要的方式运行<code>grep</code>。在</p>
<p>如果您只想实现shell <code>${grepstring}</code>的等效功能,那么最好使用Python的字符串处理命令<code>str.format</code>,正如Martijn Pieters所建议的那样。但是如果<code>grepstring</code>中有一个空格,这就行不通了。或者特殊的外壳字符。或者,更糟的是,它可以<em>工作,但不是您想要的方式(例如,如果<code>grepstring</code>是{<cd8>})。在</p>
<p>您可以尝试编写代码进行清理,然后正确引用所有字符串,但这是一项愚蠢的任务。简单的解决方案是在最简单的情况下不使用shell(比如文本shell管道字符串)。<code>subprocess</code>文档有一整节内容是关于替换旧函数和shell函数的,其中包括<a href="http://docs.python.org/3/library/subprocess.html#replacing-shell-pipeline" rel="nofollow">Replacing shell pipeline</a>。在</p>
<p>所以:</p>
<pre><code>grepstring="mystring"
p0 = Popen(['ls', '-l'], stdout=PIPE)
p = Popen(['grep', grepstring], stdin=p0.stdout, stdout=PIPE, stderr=PIPE)
p0.stdout.close()
</code></pre>
<p>现在,您得到了一个<code>p</code>,它的作用与原始示例中的相同,只是<code>grepstring</code>只是<code>Popen</code>的普通参数,而不是一个必须引用、清理并填充到shell字符串中的字符串。在</p>
<p>如果你能很容易地使用Python库中的任何一个,那么就可以很容易地使用Python的库来实现这一点。在</p>