2014-06-12 1 views
0

저는 파이썬 스크립트를 작성하여 CVS 저장소에 기능을 추가하고 있습니다. Subprocess.Popen 모듈을 사용하여 Cvs 체크 아웃을 실행하는 중입니다.서브 프로세스의 사용. CVS 저장소와 함께 열어 보시겠습니까?

subprocess.Popen('cvs -Q co -r %tag% %directory%') 

여기서 태그와 디렉토리는 단지 자리 표시 자일 뿐이며 (스크립트는 사용자 입력을 사용합니다). 내가 CVSROOT를 설정했지만 어떤 이유로 든 체크 아웃 할 스크립트를 원하는 CVS 모듈에 가져올 수 없습니다. 명령 줄에서 직접 동일한 명령 (따옴표)을 실행하면 예상대로 디렉터리가 체크 아웃됩니다.

subprocess.Popen('cvs -Q co -r %tag% %directory%', shell=True) 

을하지만 일반적으로 대신

subprocess.Popen(['cvs', '-Q', 'co', '-r', tag, directory]) 

을하는 것이 좋습니다 : 당신은 쉘에서와 같은 동작을 원하는 경우

답변

1

음, 그렇게 말해야한다.

+0

, 예를 들어, 디렉토리 이름이 공백 (또는 더 나쁜, 문자가있는 경우 두 번째 방법은 문제에서 당신을 보호한다 like>; |). Windows에서 Popen 구현은 이러한 것을 인용합니다. 리눅스에서는 셸이 무시되므로 문제가되지 않습니다. – greggo

+0

나는 둘 다 시도했지만, 주사위는 아직 없다. 첫 번째 메서드 설정 shell = True는 을 반환하고 명령 프롬프트를 열지 않았습니다. 명령을 문자열로 나열하는 두 번째 방법은 명령 프롬프트를 잠시 들었지만 즉시 닫았습니다. 텍스트를 읽을 수 없거나 (오류 메시지가있는 경우) 모듈을 체크 아웃하지 않았습니다. 이것은 이전에 시도했던 것과 같은 결과입니다. – user2049004

+0

cmd.exe를 열고 거기에 명령을 입력하여 작동하게 할 수 있습니까? – greggo

2

인수는 하위 프로세스로 전달되지 않습니다. 문자열을 열거하십시오. 당신은 목록에서 명령 및 인수를 전달해야

subprocess.Popen(['cvs', '-Q', 'co', '-r', '%tag%', '%directory%']) 

또는 대안

subprocess.Popen(shelex.split('cvs -Q co -r %tag% %directory%')) 
관련 문제