2009-12-12 2 views
0

명령을 실행하고 결과를 얻으려면 Python 2.6과 함께 서브 프로세스 모듈을 사용하려고합니다. 이 명령은 일반적으로 다음과 같이 실행한다 :cmdline에서 Python 스크립트를 통해 출력 처리

/usr/local/sbin/kamctl fifo profile_get_size myprofile | awk -F ':: ' '{print $2}' 

그 인수와 함께 해당 명령을 실행하고 명령의 반환 값을 얻기 위해 내 스크립트에 서브 프로세스 모듈을 사용하는 가장 좋은 방법은 무엇입니까? Python 2.6을 사용하고 있습니다.

답변

4

당신은 출력, 반환 값 (AKA 상태 코드), 또는 둘 모두를 원하십니까? 표준 출력 및/또는 표준 오류에 대한 파이프 라인에 의해 방출되는 데이터의 양이 너무 크지 않으면

, 그것은 "위의 모든"을 얻기 위해 매우 간단합니다

import subprocess 

s = """/usr/local/sbin/kamctl fifo profile_get_size myprofile | awk -F ':: ' '{print $2}'""" 

p = subprocess.Popen(s, shell=True, stdout=subprocess.PIPE) 

out, err = p.communicate() 

print 'out: %r' % out 
print 'err: %r' % err 
print 'status: %r' % p.returncode 

잠재적으로 처리해야하는 경우 엄청난 양의 출력이 필요합니다. 코드가 더 필요합니다. 문제의 파이프 라인을 고려할 때 문제가 발생하지 않는 것처럼 보입니다.

+0

Ok는 쉘 = True를 사용하는 이유와 서브 프로세스를 묻는 것입니다. 나머지는 고마워. – randombits

+0

파이프를 해석하고 올바르게 실행하려면 쉘이 필요합니다. _inside_ 문자열; (쉘이 실행 한) 명령 문자열의 전체'stdout '에 대해'subprocess.PIPE'가 필요합니다. –

2

f.e. 표준 출력이 같이 얻을 수 있습니다 :

>>> import subprocess 
>>> process = subprocess.Popen("echo 'test'", shell=True, stdout=subprocess.PIPE) 
>>> process.wait() 
0 
>>> process.stdout.read() 
'test\n' 
+0

호출이 성공했는지 확인하려는 경우 (수행하려는 작업이 아니라 확인하는 것이 좋음) subprocess.check_call()을 사용할 수 있습니다. 종료 코드가 0이 아니면 예외가 발생합니다 –

관련 문제