<p>如果外壳很适合您的问题,那么一定要使用外壳。在</p>
<p>您有时希望将某些东西移植到Python的原因至少对我来说是出于更好的控制:您希望能够捕捉到管道中间的错误(在您的shell脚本中是这样的),或者您希望在处理过程的中途将结果保存在某个地方,这在shell中做起来很麻烦,因为管道是友好的一维的。在</p>
<p>如果你真的坚持,那么你提到的资源(但没有链接)是通常的做法;但由于上述原因,这并不特别“常见”。在</p>
<p>下面是一个不使用shell的示例,改编自<a href="https://stackoverflow.com/questions/295459/how-do-i-use-subprocess-popen-to-connect-multiple-processes-by-pipes">this question</a>:</p>
<pre><code>from subprocess import Popen, PIPE
input="""
~|||-:this is text:-|||~
"""
p1 = Popen(['sed', r's/\([[:punct:]]\)//g'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
p2 = Popen(['text2wave', '-scale', '1', '-o', fileName],
stdin=p1.stdout, stdout=PIPE, stderr=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
p1.stdin.write(input)
p1.stdin.close()
output, error = p2.communicate()
p1.wait()
print('status: {0}\nOutput: {1}\nError:{2}'.format(p2.returncode, output, error))
</code></pre>
<p>我确信这可以扩展到两个以上的子进程,但我也坦率地相当肯定,如果你真的需要弄清楚的话,你做的是错误的。在</p>
<p>。。。而且,正如在评论中已经指出的,<code>sed</code>部分可以很容易地被<a href="https://stackoverflow.com/a/2402306/874188">simple Python snippet</a>替换</p>
^{pr2}$
<p>还要注意Python多行字符串如何替换here文档。在</p>