나는 이것이 사소한 것이고 자습서에서 찾지 않았기를 바란다. 저는 파이썬 코드를 작성하고 있습니다. 'c 코드'를 관리합니다. 일명 파이썬에서 c 타입을 가진 c 코드를 실행합니다. 이제 C 코드가 출력하는 데이터를 처리하기 위해 'printfs'를 'catch'하고 싶습니다. 어떻게 이런 짓을하나요?ctypes로 파이썬에서 c printf를 잡는 방법?
감사
나는 이것이 사소한 것이고 자습서에서 찾지 않았기를 바란다. 저는 파이썬 코드를 작성하고 있습니다. 'c 코드'를 관리합니다. 일명 파이썬에서 c 타입을 가진 c 코드를 실행합니다. 이제 C 코드가 출력하는 데이터를 처리하기 위해 'printfs'를 'catch'하고 싶습니다. 어떻게 이런 짓을하나요?ctypes로 파이썬에서 c printf를 잡는 방법?
감사
잘 printf
은 단순히 어떤에 stdout
파일 포인터가 참조 출력을 기록합니다. C 프로그램을 어떻게 실행하는지 모르겠지만 C 프로그램의 stdout
을 파이썬에서 읽을 수있는 것으로 리다이렉트 할 수 있어야한다.
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
코드 내부에 그것을 위해 메모리를 할당, byref
c_char_p
을 통과 한 후 Python
에서 버퍼를 사용하는 출력 값으로 버퍼를 업데이트 할 수 있습니다. 메모리를 할당 해제하는 것을 잊지 마십시오 (free
함수의 경우 ctypes
래퍼를 만들어야합니다).
'stdout'의 차단은 내가 염두에 두었던 것입니다. 그러나 그것은 나를 위해 작동하지 않습니다. 이 코드는 출력 동작을 변경하지 않습니다. – Framester
코드가 출력 동작을 변경하지 않음을 알 수 있습니다. 여러분이 성취하고자하는 것에 대한 더 자세한 설명과'stdout' 리다이렉션으로 인해 겪는 문제점들을 제공하면 우리가 당신을 도울 수있는 방법에 대한 힌트를 얻을 수있을 것입니다. –
자신을 분명히하지 못해 죄송합니다. 나는 'stdout'을 가로채는 코드 줄을 추가했지만 파이썬에서 ctypes로 호출하는 c 함수의 'printfs'는 여전히 터미널에서 출력됩니다. 나는 대답에서 내 문제에 대한보다 구체적인 설명을 추가 할 것이다. – Framester
Python에서 C printf를 오버로드 하시겠습니까? – luc
오버로드하는 경우, 어떤 OS 에서요? – Arlaharen
과부하로 인해 문제가 해결되면 시도해 보겠습니다. 나는 우분투 9.10을 사용한다. – Framester