使用heredocs的Python子流程

Mit*_*aro 4 python subprocess heredoc

我在玩Python的子流程模块,尝试了一些示例,但似乎无法使Heredoc语句起作用。

这是我正在玩的简单示例:

import subprocess
a = "A String of Text"
p = subprocess.Popen(["cat", "<<DATA\n" + a + "\nDATA"])
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时出现以下错误:

cat: <<DATA\nA String of Text\nDATA: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我做错了吗?这有可能吗?如果是这样,我将如何去做?


更新资料

只是想说,永远不要在真正的python程序中执行此操作,因为有更好的方法可以执行此操作。

Gre*_*ill 6

外壳程序“ heredoc”支持是外壳程序功能。subprocess.Popen默认情况下不会通过外壳运行您的命令,因此此语法当然不起作用。

但是,由于无论如何都在使用管道,因此不需要使用Shell的Heredoc支持。只需将字符串写入a刚开始的进程的stdin管道即可。无论如何,这正是外壳将使用heredoc执行的操作。

您可以使用Popen.communicate()

p.communicate(a)
Run Code Online (Sandbox Code Playgroud)

communicate()函数的返回值包含流程的输出(分为两个流,请参见文档)。