2012-06-13 6 views
4

나는 파이썬 코드가 내장 된 C 프로그램을 가지고있다. 파이썬 2.7.2를 소스에서 컴파일하고 내 프로그램을 libpython2.7.a와 연결했습니다.ctype을 사용하여 C에 포함 된 Python에서 C 함수를 콜백 할 수 있습니까?

이제 내 파이썬 코드에서 다른 C 라이브러리의 함수를 내 C 프로그램에 링크하고 싶습니다. 파이썬 확장을 작성할 수 있습니다 (this document에 임베디드 파이썬 확장 참조). 그러나 ctypes을 사용하면 훨씬 쉽게 처리 할 수 ​​있으며 기존 코드를 사용하지 않아도됩니다.

ctypes은 공유 라이브러리를로드하는 데 도움이되며 내 정적 프로그램 코드로 되돌릴 수있는 방법이 있는지 궁금합니다.

대상이 iOS이고 AFAIK 공유 라이브러리가 Apple에서 금지되어 있으므로 관련 코드를 공유 라이브러리로 컴파일 할 수 없습니다. 파이썬 코드에서

답변

2

,이 같은 정적 기능하는 ctypes 래퍼를 만들 수 있습니다

restype = ctypes.c_int 
argtypes = [ctypes.c_int, ctypes.c_double]  # or whatever 
functype = ctypes.CFUNCTYPE(restype, *argtypes) 
wrapper = functype(address_of_static_function_as_an_int) 

당신은 물론 당신의 C 코드에서이 (또는 유사한) 코드를 호출 할 수 있습니다.

+0

_ctypes에서 내 (정적) libffi에 오류가 발생합니다. – Avner

+0

@Avner : 솔직히 위의 코드를 실제로 시도하지 않았으므로 그 충돌로 인해 도움을받을 수 없습니다. –

+0

코드가 올바르게 보입니다 (이것이 내 대답을 받아 들인 이유입니다). 문제는 iOS에 libffi를 이식하는 것과 libpython.a (정적 모듈, 정적 _ctypes 및 정적 libffi)를 컴파일하는 방법과 관련된 것입니다. 그러나 나는이 충돌을 아직 풀지 않았으므로, 이것은 현재 의심의 여지가있다. – Avner

0

함수 포인터를 캡슐화하고 ctypes 값 (예 : ctypes.c_void_p)을 만들어 Python 코드에 전달하십시오.

+0

그런 다음 파이썬 코드에서 * what *을 사용합니까? –