2012-11-06 5 views
1

Popen을 사용하여 프로세스를 생성하려고 시도하고 특정 문자열을 stdin에 보내려고합니다.Popen.communicate가 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 

가 어떻게이 문제를 방지 할 수 있습니까?

+0

'bash'에'cmd = 'cat' '을 사용하여 코드를 실행하면'cat'은'\'을 출력하지 않습니다. 어떤 쉘을 사용하고 있습니까? 'cmd'가 무엇인지 말해 줄 수 있습니까? @ BrianCain의 제안으로 문제가 해결 되었습니까? –

+2

프로그램에서 문자열의 이스케이프 된 버전을 인쇄하지 않는 것이 확실합니까? 파이썬은 여기서 벗어날 수 없다고 확신합니다. – mata

+1

당신은'pipe.stdin.close()'가 필요 없습니다. 'pipe.communicate()'는 stdin을 단독으로 닫아야한다. – jfs

답변

0

당신이 알고하지 않는 :

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')) 

는 모두 같은 출력을 생성 당신은 어떤 이유로 든 그것을 필요로합니다. "shell = True"로 일반적으로 실행하지 마십시오 (테스트하지 않고, sou 여기에 무슨 일이 벌어지고 있는지와 같은 nds).

3

내가 우분투를 재현 할 수없는이 경우 shell=True에서

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')) 

하는 것은 불필요 :

T-h-i-s- -$-P-A-T-H- -i-s- -a- -s-t-r-i-n-g- 
관련 문제