2014-11-25 3 views
1

저는 Python을 통해 Bazaar 버전 제어를 실행하려고합니다. 이 목적을 위해 "os.system ('')"을 사용하고 있습니다. (지금은 명령 프롬프트를 통해 명령을 실행하는 것이 권장 된 명령이 아닙니다.)Python에서 CMD 명령을 실행하여 텍스트 출력하기 (0123)

"BZR commit [file] -m '[text]'명령을 실행하고 싶습니다. 이렇게하면 Bazaar가 실행되고 [file]에 대한 변경 사항을 [text] 메시지와 함께 커밋합니다. 이 명령을 실행하면 Bazaar가 몇 줄의 텍스트를 명령 프롬프트에 인쇄하여 기본적으로 성공했는지 여부를 알려줍니다.

"os.system ('[message]')"(여기서 [message]는 앞에서 언급 한 명령 임)으로이 명령을 실행하면 명령 프롬프트에서 명령을 성공적으로 수행하고 관련 행을 인쇄합니다. 파이썬에서이 행을 되돌아가 원하는 것을 확인하고 싶습니다. 이것이 제 문제입니다.

나는 "result = os.system ('[message]')와 같은 것을 시도했지만 이것은 작동하지 않습니다. '결과 = 3'은 3이 분명히 명령 프롬프트의 출력이 아닙니다.

나는 해결책을 찾기 위해 노력했으며 '서브 프로세스'에 관한 많은 제안 (예 : here)을 발견했습니다. 그러나 이것들은 작동하지 않는 것 같고 (적어도 필자는 그것들을 작동시키지 못하는 것 같다.) 'Popen'과 'communicate()'를 사용하여 출력을 얻고 오류를 얻는 것과 같은 기술을 사용한 결과는 둘 다 '없음'. 내가 뭔가 잘못하고있는 것일 수도 있습니다.

내가 원으로 돌아가고 있다고 느낄 때 도움이 될 것입니다. 또한 사과가 어딘가에 해결 되었다면, 나는 정말로 구글을 통해 해결책을 찾고, stackoverflow를 검색했지만 올바르게 실행할 수 없었다.

누구든지 도움을 줄 수있는 정보가 더 필요하면 도와주세요.

감사합니다.

import subprocess 
file = "foo.txt" 
text = "'comment'" 
output = subprocess.check_output(["BZR", "commit", file, "-m", text]) 
print(output) 

면책 조항 :

+2

당신은 ['subprocess.check_output'] (https://docs.python.org/3/library/subprocess.html#subprocess.check_output) – CoryKramer

+0

당신이 가지고있는 서브 프로세스의 코드를 추가 사용할 수 있습니다 시도한 결과와 오류 출력 –

+0

[this answer] (http()의 스크립트 마지막 부분에 표시된 것처럼'subprocess.Popen(). stdout with output :','for line in output :'을 사용할 수 있습니다. : //stackoverflow.com/questions/4415134/python-on-windows-run-multiple-programs-sequentially-in-one-command-prompt/4416529#4416529). – martineau

답변

0

사이버 언급 한 바와 같이, subprocess.check_output 그 일의 정말 쉬운 방법이 코드는 파이썬으로 작동합니다 2.7 이상

+0

도움을 주셔서 감사합니다 : 나는 그것을 시도했지만 작동하지 않는 것 같습니다 (Python2.7을 사용하고 있습니다). 하나의 문제는 : BZR 자체가 Python 기반 (또는 적어도 유사) 인 것 같습니다. 실행될 때 오류가 발생하면 Python 스크립트로 다시 피드를 보내고 중지합니다 (따라서 '출력'이 저장되지 않음을 의미합니다) . 적어도 그것이 내가 그것을 해석하는 방법입니다. 다른 문제는 다음과 같습니다. 문제없이 명령을 실행하면 ""(즉, 빈 문자열)을 저장하는 것으로 보입니다. – Steve

+0

파이썬 오류는'stdout'이 아닌'stderr'에 인쇄됩니다. 따라서 충돌이 발생하면 왜 출력을 저장하지 않을까요? 'output = subprocess.check_output ([ "/ bin/sh", "BZR commit foo.txt -m 'comment'2> & 1"])'과 같은 것을 할 수 있습니다. 이렇게하면'stderr' 메시지가'stdout'에 출력됩니다. – RPGillespie

+0

사실, 이전 제안은 효과가 없을 수도 있지만, 관심있는 정보는'stdout'이 아니라'stderr'에있을 수 있습니다. 또한 호출을'try : except' 블록에 두어 실패한 서브 프로세스가 최상위 프로그램을 크래시하지 않도록해야합니다. – RPGillespie

0

내가 자식을 사용하여 내 파이썬 프로그램에 대한 비슷한 할 버전 정보를 얻을 수 있습니다. 바라건대, 버전 관리에도 잘 작동 할 것입니다. 근무 예 :

from subprocess import Popen, PIPE 

p1 = Popen(['git', 'log' , '-n', '1'], stdout=PIPE, shell=False) 
msgout = p1.communicate()[0] 
#msgerr = p1.communicate()[1] # this captures stderr info but you have to rerun p1 
print msgout 
관련 문제