2011-03-25 4 views
1

뒤로 ctypes를 사용하여 상용 DAQ 라이브러리 주위에 얇은 래퍼를 작성했습니다. 그때 이후로 나는 Cython을 건너 왔고 보다 더 좋게/더 깨끗하게 만들 수 있다고 생각하고있다. 나는 전에 가지고 있었다. 대부분의 Cython 문서는 의미가 있습니다. 그리고 제가 알고있는 것은 대부분 입니다. 그러나 포장하고있는 라이브러리는 매우 높습니다. windows 특정 및 표준 C/C + + 코드와 약간 다른 것들을 수행합니다. 내가 알 수 있듯이.Cython을 사용하여 어려운 C 헤더 파일을위한 Python 래퍼 쓰기

다음은 헤더 파일의 몇 조각입니다. 정확히 포장하지 말고 입니다.


#ifndef DAQ_H 
#define DAQ_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

#if !defined(_DAQAPI32_) 
    #define DAQAPI __declspec(dllimport) 
#else 
    #define DAQAPI 
#endif 

내가 수집 무엇을, 나는 아마 내 사이 썬 정의이 대부분을 무시할 수에서 ? gcc를 사용하여 C 코드를 컴파일하려고 시도했지만 모든 함수 정의에서 오류가 발생합니다. ctypes를 사용하여 라이브러리에 직접 액세스했으며 헤더 파일을 전혀 사용하지 않았습니다.


이 대부분의 기능을 선언하고 운영하는 방법을 기본적으로
/* Handle Type Definition */ 
typedef INT DaqHandleT; 

/* Initialization and Locking Prototypes */ 
DAQAPI DaqHandleT WINAPI daqOpen(LPSTR daqName); 
DAQAPI DaqError WINAPI  daqClose(DaqHandleT handle); 
DAQAPI DaqError WINAPI  daqOnline(DaqHandleT handle, PBOOL online); 

/* Error Handler Type Definitions */ 
typedef VOID CALLBACK  DaqErrorHandlerFT(DaqHandleT handle, 
DaqError errCode); 
typedef DaqErrorHandlerFT *DaqErrorHandlerFPT; 

/* Error Handler Function Prototypes */ 
DAQAPI DaqError WINAPI daqSetDefaultErrorHandler(DaqErrorHandlerFPT 
handler); 
DAQAPI DaqError WINAPI daqSetErrorHandler(DaqHandleT handle, 
DaqErrorHandlerFPT handler); 
DAQAPI DaqError WINAPI daqProcessError(DaqHandleT handle, DaqError 
errCode); 
DAQAPI DaqError WINAPI daqGetLastError(DaqHandleT handle, DaqError 
*errCode); 
DAQAPI VOID CALLBACK daqDefaultErrorHandler(DaqHandleT handle, 
DaqError errCode); 
DAQAPI DaqError WINAPI daqFormatError(DaqError errorNum, PCHAR msg); 

. 그들은 오류 코드 만 반환합니다. 중요한 정보는 포인터를 통해 완료된 입니다. 내가 문서에서 반환 형식에 대한 포인터를 사용하여 작업하는 방법에 아무것도 찾을 수 없습니다, 아마도 충분히 보이지 않았다 하드.

이런 종류의 포장을 위해 올바른 방향으로 누군가 나를 가리킬 수 있습니까? ?

DaqError와 같은 것은 실제로 헤더 파일에 선언 된 열거 형입니다. 이 라이브러리에서 약 1500 행의 abum 열거 형 열거 형입니다. 어떤 도움

감사합니다,

답변

1

는 반환 형식과 사이 썬의 형식 정의를 작성합니다. 이런 식으로 cython은 원본 라이브러리의 동일한 매크로를 사용합니다.

cdef extern from "header.h": 

    ctypedef void * win_api_t "DAQAPI DaqHandleT WINAPI" 
    win_api_t daqOpen(char*) 

cpdef pyDaqOpen(pystr): 
    daqOpen(pystr)