2012-07-11 3 views
5

하위 프로세스를 사용하여 실행중인 C++ 프로그램에서 인쇄 명령문 집합의 데이터를 읽으려고합니다.stdout 리디렉션을 사용하여 파이썬 하위 프로세스가 int를 반환 함

C++ 코드 :

printf "height= %.15f \\ntilt = %.15f \(%.15f\)\\ncen_volume= %.15f\\nr_volume= %.15f\\n", height, abs(sin(tilt*pi/180)*ring_OR), abs(tilt), c_vol, r_vol; e; //e acts like a print 

파이썬 코드 : 그러나

run = subprocess.call('Name', stdout = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 

대신 데이터를 가져 오는, 나는 점점 오전 모두 단일의 int, 종료 코드, 중 0 또는 오류가 암호. 물론 파이썬은 나에게 "AttributeError : 'int'객체에 'communicate'속성이 없다고 알려줍니다.

데이터 (printf)를 실제로 얻는 방법은 무엇입니까?

답변

4

subprocess.call은 명령을 실행하고 종료 상태를 반환합니다 (파이썬에서는 종료 상태를 sys.exit(N)으로 설정할 수 있습니다 - 다른 언어에서는 종료 상태가 다른 방법으로 결정됩니다). 실제로 프로세스를 처리하려면 subprocess.Popen을 사용해야합니다. 따라서, 귀하의 예를 들면 다음과 같습니다

run = subprocess.Popen('Name', stdout = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 

프로그램의 종료 상태는 returncode 속성을 통해 사용할 수 있습니다. 할

또한, 스타일을 말하자면, 나는 것 중 하나

run = subprocess.Popen('Name', stdout = subprocess.PIPE, stderr = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 

나 :

run = subprocess.Popen('Name', stdout = subprocess.PIPE, env={'LANG':'C++'}) 
data, _ = run.communicate() 

을 자신에게 표준 오류를 캡처 할 수있는 기능을 제공하지 않을 때문에, 당신은 아마도 'shouldn 너 뭔가 의미있는 척하는 척 하지마.

관련 문제