1

我正在尝试使用生成一个进程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

我怎样才能防止这种行为?

4

2 回答 2

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-
于 2012-11-06T22:27:54.810 回答
0

除非您知道出于某种原因需要它,否则通常不要使用“shell=True”运行(未经测试,这听起来就像这里发生的事情)。

于 2012-11-06T23:20:59.220 回答