2014-01-15 3 views
1

내가 좋아하는 할 경우 :어떻게 파이썬에서 서브 프로세스 대신 명령 출력을 얻을 수 있습니까?

x = subprocess.Popen(["nosetests",  
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", "-v"], 
stdout=subprocess.PIPE) 

나는 실행 내 명령의 출력을 가지고

test_it_has_an_initial_state (TestStateMachine.FluidityTest) ... ok 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

OK 

하지만 만약 내가 가지고 예를 들어 전화 x.communicate() :

('', None) 

어떻게 그 메시지를 변수에 저장할 수 있습니까?

+0

제목이 약간 혼란 스럽습니다. 명령 하위 프로세스 (또는 하위 프로세스 모듈)가 자체 출력을 사용자로부터 훔치는 것이 아닙니다. 서브 프로세스 나 출력을 훔치는 것이 아니기 때문에 마치 출력을 마치'print'하고있는 것처럼 출력을 직접 출력 할 수 있습니다. – abarnert

답변

4

문제는 거의 확실하게 명령이 stderr와 stdout에 쓰여지고 있으며 stdout 만 캡처하는 것이 확실합니다. 당신이 하나의 문자열로 함께 두 가지를 병합 할 경우

, 이렇게 :

x = subprocess.Popen(["nosetests", 
         "TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", 
         "-v"], 
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

out_and_err, _ = x.communicate() 

을 별도의 문자열로 얻고 싶은 경우에이 아래에 설명

x = subprocess.Popen(["nosetests", 
         "TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", 
         "-v"], 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

out, err = x.communicate() 

Frequently Used Arguments :

stdin, stdoutstderr은 실행 된 프로그램의 표준 입력, 표준 출력 및 표준 오류 파일 핸들을 각각 지정합니다. 유효한 값은 ... stderrSTDOUT 일 수 있으며 이는 하위 프로세스의 stderr 데이터를 표준 출력과 동일한 파일 핸들로 캡처해야 함을 나타냅니다.

그러나 이전에 표준 오류에 대해 들어 본 적이 없다면이 사실을 알지 못했을 것입니다. 문서는 다음에 대한 개별 출력 및 오류 파이프의 기본 C/POSIX 모델을 알고 있다고 가정합니다. 모든 프로그램. 보조 노트로


, 당신은 그것의 표준 출력과 그것의 표준 오류를 병합, 프로그램을 실행하고 출력을 얻을 수있다 실행하려는 모든, 당신은 Popen를 만들고에 communicate를 호출 할 필요가없는 경우; 그냥 check_output을 사용하십시오 :

out_and_err = subprocess.check_output([… args …], stderr=subprocess.STDOUT)