[Python] ctypes 로 char** 를 인자로 넘길 때 Develop Tip

다음과 같은 C 함수고 있고, so 공유라이브러리로 저장된다고 하지요.

bool addIndex(char **ndx_fields)
{
  for (int i = 0; ; ++i) {
    if (nix_fields[i] == NULL) break;
    // ...
  }
  return true;
}

위의 코드는 ndx_fields가 char ** 포인터 인데,
각각,

ndx_fields[0] = "abide" 를 가리키고,
ndx_fields[1] = "abide" 를 가리키고,
...
ndx_fields[9] = NULL 로 마무리를 한다고 보는 것입니다.

이제 이것을 파이썬에서 호출해 보겠습니다.

(이것 푸는데 꼬박 한나절 이상 시행착오를 했습니다)

cs_lib = ctypes.CDLL('./.../libfoo.so') # 가져올 공유 라이브러리 연동
cs_lib.addIndex.argtypes = (ctypes.POINTER(ctypes.c_char_p))
cs_lib.addIndex.restype = ctypes.c_bool

ndx_fields = [ 'aa','bob','ccc','ddd' ]
sparray_type = ctypes.c_char_p * (len(ndx_fields)+1)
sparray = eval('sparray_type(%s,None)' % ','.join([ "'%s'" % x for x in ndx_fields] ))
rc = self.cs_lib.addIndex(sparray)

위와 같은 방식으로 호출하면 잘 동작합니다.


어느분께는 도움이 되셨기를...

핑백

덧글

댓글 입력 영역

구글애드텍스트