2013-09-07 11 views
2

일련의 명령을 받아 실행하는 도구를 작성하고 있습니다.Popen을 다른 쉘로 호출하는 방법?

명령은 터미널/콘솔에 입력 한 것처럼 작성해야합니다. 이를 위해 Popen()shell=True과 같이 사용하여 터미널/콘솔에 입력 한 사람의 행동을 모방했습니다.

이제 사용자가 좋아하는 명령 인터프리터를 지정할 수있게하고 싶습니다. 좀 더 정확하게 말하자면, Windows에서는 cmd.exe 대신 "Git bash"를 사용할 수 있습니다.

Popen()'s documentation에 따르면, 사용할 인터프리터의 선택은 환경 변수 COMSPEC을 통해 수행됩니다.

나는 호출하기 전에 C:\Program Files (x86)\Git\bin\bash.exeCOMSPEC을 설정하려고했으나 base-c을 기대하면서 하위 프로세스는 명령에 /c 추가하기 때문에 그것은 실패합니다.

나는 shell=True를 사용하지 않을 생각하지만 나는 차이점이 무엇인지 정확히 모르는 :

  • 내가 인수에 명령 줄을 .split()해야 하는가? 그렇다면 어떻게?
  • shell=True이 의미하는/설정하는 플래그가 있습니까?

여기서 목표는 Popen(shell=True) 안에있는 "마법"을 다시 구현하지 말고 가능한 한 최선을 모방하는 것입니다.

의견이 있으십니까?

답변

7

shell=True은 거의 보편적으로 잘못된 것이고, 여기서는 다르지 않습니다. 이 경우, 배쉬, 사용에 의해 구문 분석을 위해 만들어진 문자열 곳 your_command입니다 :

subprocess.Popen([r'C:\Program Files (x86)\Git\bin\bash.exe', "-c", your_command]) 

은 ... 그리고 그 명령은 대신에 필요로하는 것보다, 지정된 쉘 (힘내가 제공하는 일)에 의해서만 해석됩니다 쉘에 의해 COMSPEC에 파싱되어 bash가 사용할 명령을 생성하십시오.

+0

'r ""'리터럴 또는 이스케이프 슬래시 (' "\ b"! = r "\ b"== "\\ b"')를 사용하십시오. – jfs

+0

@ J.F.Sebastian 잘 했어, 고마워. 업데이트되었습니다. –

관련 문제