2014-04-26 1 views
2

환경을 사용하는 일부 셸 프로그램을 호출하려고하는데 올바른 방법을 찾으려고합니다. 나는이 조각에 내려 삶은 : "쉘이"true를 인쇄 "('\ n을'없음)"그리고 그것은 거짓이 인쇄 "로 설정되어 ('안녕하세요 $ FOO \ n에 설정되어popen 호출에서 변수 확장/대체

import subprocess as sp 

p = sp.Popen(["echo","Hello","$FOO"], env = {"FOO":"42"}, stdout = sp.PIPE, shell = True) 
p.wait() 
print(p.communicate()) 

', None) ")하지만,"('Hello 43 \ n ', None) "행을 따라 인쇄 할 것을 기대하고있었습니다. 내가 뭘 잘못하고 더 좋은 방법이 그것을 할 수 있습니까?

+1

부모의 ENVVAR 확장 할 수 있어야한다 :'os.path.expandvars ("$의 PATH는 윈도우에서 작동을")' – jfs

+1

를 [목록 인수를 사용하여 subprocess.Popen 명령을'shell = True'와 함께 지정하지 마십시오.] (http://bugs.python.org/issue21347) – jfs

+1

읽지 않는 한'stdout = PIPE'을 사용하지 마십시오. 나중에'p.stdout'에서. 'p.wait()'를 제거하십시오 : 자식 프로세스가 파이프 버퍼를 채우기에 충분한 출력을 생성하면 프로그램을 교착 상태로 만들 수 있습니다. – jfs

답변

3

이 시도 :

p = sp.Popen("echo Hello $FOO", env={"FOO":"42"}, shell=True) 

출력에 "Hello (42)"

+1

Windows (Win7, Python 3.4.4)에서는'% FOO %'만 올바르게 확장되었습니다. –