Popen.communicate转义我发送给stdin的字符串

时间:2012-11-06 21:54:55

标签: python subprocess

我正在尝试使用Popen生成一个流程,并将特定字符串发送到stdin

我有:

pipe = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE)
pipe.communicate( my_stdin_str.encode(encoding='ascii') )
pipe.stdin.close()

然而,第二行实际上逃脱了my_stdin_str中的空格。例如,如果我有:

my_stdin_str="This is a string"

该过程将会看到:

This\ is\ a\ string

如何防止此行为?

2 个答案:

答案 0 :(得分:3)

我无法在Ubuntu上重现它:

from subprocess import Popen, PIPE

shell_cmd = "perl -pE's/.\K/-/g'"
p = Popen(shell_cmd, shell=True, stdin=PIPE)
p.communicate("This $PATH is a string".encode('ascii'))

在这种情况下,shell=True是不必要的:

from subprocess import Popen, PIPE

cmd = ["perl", "-pE" , "s/.\K/-/g"]
p = Popen(cmd, stdin=PIPE)
p.communicate("This $PATH is a string".encode('ascii'))

两者产生相同的输出:

T-h-i-s- -$-P-A-T-H- -i-s- -a- -s-t-r-i-n-g-

答案 1 :(得分:0)

除非您因某些原因知道自己需要它,否则不要使用" shell = True"一般来说(没有测试,听起来像是在这里发生的事情)。