2010-06-28 4 views
5

나는 이것이 사소한 것이고 자습서에서 찾지 않았기를 바란다. 저는 파이썬 코드를 작성하고 있습니다. 'c 코드'를 관리합니다. 일명 파이썬에서 c 타입을 가진 c 코드를 실행합니다. 이제 C 코드가 출력하는 데이터를 처리하기 위해 'printfs'를 'catch'하고 싶습니다. 어떻게 이런 짓을하나요?ctypes로 파이썬에서 c printf를 잡는 방법?

감사

+0

Python에서 C printf를 오버로드 하시겠습니까? – luc

+0

오버로드하는 경우, 어떤 OS 에서요? – Arlaharen

+0

과부하로 인해 문제가 해결되면 시도해 보겠습니다. 나는 우분투 9.10을 사용한다. – Framester

답변

0

printf은 단순히 어떤에 stdout 파일 포인터가 참조 출력을 기록합니다. C 프로그램을 어떻게 실행하는지 모르겠지만 C 프로그램의 stdout을 파이썬에서 읽을 수있는 것으로 리다이렉트 할 수 있어야한다.

2

C 코드에서 쓰여지기 전에 stdout을 차단 한 다음 출력 값을 처리 할 수 ​​있습니다.

import sys 
import StringIO 

buffer = StringIO.StringIO() 

# redirect stdout to a buffer 
sys.stdout = buffer 

# call the c code with ctypes 
# process the buffer 

# recover the old stdout 
sys.stdout = sys.__stdout__ 

그러나, C 코드로 버퍼를 통과 쉽고 좋을 것이고, printf 출력 값 -ing 대신 사용자는 제공된 버퍼들을 쓴다.

또는 더 나은 아직, 당신의 C 코드 내부에 그것을 위해 메모리를 할당, byrefc_char_p을 통과 한 후 Python에서 버퍼를 사용하는 출력 값으로 버퍼를 업데이트 할 수 있습니다. 메모리를 할당 해제하는 것을 잊지 마십시오 (free 함수의 경우 ctypes 래퍼를 만들어야합니다).

+0

'stdout'의 차단은 내가 염두에 두었던 것입니다. 그러나 그것은 나를 위해 작동하지 않습니다. 이 코드는 출력 동작을 변경하지 않습니다. – Framester

+0

코드가 출력 동작을 변경하지 않음을 알 수 있습니다. 여러분이 성취하고자하는 것에 대한 더 자세한 설명과'stdout' 리다이렉션으로 인해 겪는 문제점들을 제공하면 우리가 당신을 도울 수있는 방법에 대한 힌트를 얻을 수있을 것입니다. –

+0

자신을 분명히하지 못해 죄송합니다. 나는 'stdout'을 가로채는 코드 줄을 추가했지만 파이썬에서 ctypes로 호출하는 c 함수의 'printfs'는 여전히 터미널에서 출력됩니다. 나는 대답에서 내 문제에 대한보다 구체적인 설명을 추가 할 것이다. – Framester