2016-12-06 1 views
3

문자열의 배열을 전달하는 것은 난 ctypes 통해 C 함수에 전달하고 싶은 :파이썬하는 ctypes : I 파이썬 2.7, 문자열의 배열을

unsigned int SetParams(unsigned int count, const char **params) 

그래서 I 파이썬 파라미터를 정의 할 수있다 :

import ctypes as ct 
lib = ct.cdll.LoadLibrary('...') 
lib.SetParams.restype = ct.c_uint 
lib.SetParams.argtypes = [ct.c_uint, ct.POINTER(ct.c_char_p)] 

하지만 지금 내가 어떻게 실제로 그것을 부릅니까, 위의 라이브러리 호출에 사용하고자하는 파이썬 함수에서 PARAMS 세트를 제공하고 때? ctypes

def setParameters(strParamList): 
    numParams = len(strParamList) 
    strArrayType = ct.c_char_p * numParams 
    strArray  = strArrayType() 
    for i, param in enumerate(strParamList): 
     strArray[i] = param 
    lib.SetParams(numParams, strArray) 

난 그냥 시작하고이 할 수있는보다 자동화 된 방법이 있는지 궁금 : 나는 이런 식으로 뭔가를 생각하고? 또한 할당 strArray[i] = param 실제로 재 할당입니까? 그렇다면 이것은 꽤 비싸 보입니다. 파이썬 할당 된 버퍼에 문자열 포인터를 가리키는 것만 할 수도 있고 NULL로 끝나지 않은 방법일까요?

업데이트 나는 몇 가지 관련 질문을 살펴 보았지만 똑같은 문제를 다루는 직접적인 것을 찾지 못했습니다. 대단히 감사합니다.

+0

'보다 자동화 된'경우 Cython을 살펴볼 수 있습니다. – pvg

답변

1

정확하게 생각합니다. 그 코드가 작동합니다. 예를 들어, 콜 :

setParameters(['abc','def','ghi']) 
I 소스에보고되지 않은

하지만 ctypes을 파이썬 2.7 (32 비트)가 C 함수에 전달 된 문자열을 수정하여 테스트 내부 파이썬 버퍼 (통과 않는다 파이썬에서 호출 한 후 출력). 위의 코드에서 파이썬 문자열을 const char*으로 전달하거나 적어도 문자열을 수정하지 않는 것으로 알려진 함수에만 파이썬 문자열을 전달해야하는 이유가 여기에 있습니다. 파이썬 문자열은 C에서 불변의 문자로 쓰이기 때문에 no-no입니다. ctypes.create_string_buffer을 사용하여 비 const char*에 전달할 쓰기 가능한 문자열을 만듭니다.