将 subprocess.call 用于带有管道重定向的命令

Use subprocess.call for command with a pipe redirection

在这里阅读了其他答案后,我知道 shell=True 不受欢迎,但我在使用带有管道重定向的命令(更准确地说是一对命令?)时遇到了问题。

这个有效:

subprocess.call('echo "Test" | mail -s "Test" test@gmail.com', shell=True) 

但这不是:

subprocess.call(["echo", "Test", "|", "mail", "-s", "'Test'", test@gmail.com"]))

关于如何使第二个工作的任何建议?

您可以执行如下操作以获得如下管道输出:

echo "Test" | mail -s "Test" test@gmail.com'

基本上,创建多个 subprocess.Popen 对象,将一个的标准输出指定为 PIPE,并将其作为标准输入提供给另一个对象:

p1 = Popen(["echo", "Test"], stdout=PIPE)
p2 = Popen(["mail", "-s", "Test", "test@gmail.com"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

您可以check this了解更多信息。