2
C 타입 라이브러리를 사용하여 파이썬에서 C 라이브러리로 char * 배열을 전달할 방법이 필요합니다.C 타입을 가진 C 메소드 호출하기 C 타입과 함께 파이썬에서
세분화 오류, 다른 정보 쓰레기 처리로 이어질 수있는 몇 가지 방법을 시도했습니다.
C 타입 라이브러리를 사용하여 파이썬에서 C 라이브러리로 char * 배열을 전달할 방법이 필요합니다.C 타입을 가진 C 메소드 호출하기 C 타입과 함께 파이썬에서
세분화 오류, 다른 정보 쓰레기 처리로 이어질 수있는 몇 가지 방법을 시도했습니다.
저는 얼마 동안이 문제에 어려움을 겪었으므로 다른 사람들이 혜택을 얻을 수 있도록 작은 HowTo를 작성하기로했습니다.
이 코드 C 조각을 갖는
우리는 (하는 ctypes에 대한 자세한 정보는 이전 포스트에서 찾아 볼 수있다)하는 ctypes를 사용하여 파이썬에서 호출 할, 그래서 우리는 다음과 같은 코드를 적어void passPointerArray(int size, char **stringArray) {
for (int counter=0; counter < size; counter++) {
printf("String number %d is : %s\n", counter, stringArray[counter]);
}
}
:
를def pass_pointer_array():
string_set = [
"Hello",
"Bye Bye",
"How do you do"
]
string_length = len(string_set)
select_type = (c_char_p * string_length)
select = select_type()
for key, item in enumerate(string_set):
select[key] = item
library.passPointerArray.argtypes = [c_int, select_type]
library.passPointerArray(string_length, select)
지금 나는 그것을 읽어 매우 단순하게 나타납니다,하지만 난 C 함수가 문자열을 수정하는 경우
... 세그멘테이션 오류를 방지하기 위해하는 ctypes에 전달할 적절한 유형을 찾는 많은 즐길 , 'create_string_buffer'로'c_char' 배열을 만듭니다. 'select = (POINTER (c_char) * len (string_set)) (* map (create_string_buffer, string_set))'를 호출한다. – eryksun
그리고 어떤 arg 유형을 사용해야합니까? –
타입 안전성에 문제가 없다면'c_void_p'를 사용할 수 있습니다. 그러면 모든 포인터 유형을 사용할 수 있습니다. 'POINTER (POINTER (c_char))'도 사용할 수 있습니다. 그러나 ctypes 타입 시스템은 용서할 수 없으므로,'c_char_p' 배열로 믹싱을한다면 우선'cast'해야만 징징 거리지 않게됩니다. – eryksun