.so
라이브러리를 파이썬 코드로 가져 와서 C 함수를 사용하려고합니다. 사용을 생각합니다C 헤더 파이썬
from ctypes import *
import ctypes
lib = CDLL('./libcaenhvwrapper.so.5.56')
잘 작동합니다. 헤더 파일 에 정의 된 일부 사용자 정의 유형을 사용해야하지만 액세스 할 수 없습니다.
는 종류가.so
파일
ctypes
모듈로드에없는 사전
.so
라이브러리를 파이썬 코드로 가져 와서 C 함수를 사용하려고합니다. 사용을 생각합니다C 헤더 파이썬
from ctypes import *
import ctypes
lib = CDLL('./libcaenhvwrapper.so.5.56')
잘 작동합니다. 헤더 파일 에 정의 된 일부 사용자 정의 유형을 사용해야하지만 액세스 할 수 없습니다.
는 종류가.so
파일
ctypes
모듈로드에없는 사전
에 감사합니다. 심지어 C.에서
C 유형은, 그들이 헤더에 선언하고 그런 식으로 작동하지 않습니다 당신은 (C) 라이브러리를 사용하는 헤더가 있어야합니다
사용해야 할거야다양한 ctypes
API를 사용하여 Python으로 유형을 다시 만들 수 있습니다. struct
및 union
유형의 작업 방법은 this part of the tutorial을 참조하십시오.
이제 내 코드는 일반 C 라이브러리와 작동하지만 Caen과 .so의 .so 라이브러리를 사용해야합니다. 세그먼트 오류가 발생합니다. 이 코드는 다음과 같습니다.
from ctypes import *
lib = CDLL('./libcaenhvwrapper.so.5.56')
lib.CAENHVInitSystem.restype = c_int
lib.CAENHVInitSystem.argtypes = [c_int, c_int, c_char_p, c_char_p, c_char_p]
lib.CAENHVGetError.restype = c_int
CAENHV_SYSTEM_TYPE_t = c_int
sy1527 = CAENHV_SYSTEM_TYPE_t(0)
sy2527 = CAENHV_SYSTEM_TYPE_t(1)
sy4527 = CAENHV_SYSTEM_TYPE_t(2)
sy5527 = CAENHV_SYSTEM_TYPE_t(3)
n568 = CAENHV_SYSTEM_TYPE_t(4)
v65xx = CAENHV_SYSTEM_TYPE_t(5)
n1470 = CAENHV_SYSTEM_TYPE_t(6)
v8100 = CAENHV_SYSTEM_TYPE_t(7)
link = c_int
LINKTYPE_TCPIP = link(0)
LINKTYPE_RS232 = link(1)
LINKTYPE_CAENET = link(2)
LINKTYPE_USB = link(3)
LINKTYPE_OPTLINK = link(4)
LINKTYPE_USB_VCP = link(5)
string15=c_char*15
address=string15('1','3','7','.','1','3','8','.','1','3','.','2','0','3','\0')
userName = c_char_p('user')
passwd = c_char_p('user')
ret_init = lib.CAENHVInitSystem(0, 0, address, userName, passwd)
세그먼트 화 오류가 발생하면 함수를 호출하려고합니다. 유형이 올바르게 정의 된 것 같습니다. 아래 코드는 잘 작동하는 코드를 볼 수 있습니다.
from ctypes import *
lib2 = CDLL('/lib64/libc.so.6')
string15=c_char*15
address=string15('1','3','7','.','1','3','8','.','1','3','.','2','0','3','\0')
address1=create_string_buffer('137.138.13.203')
address2=c_char_p('137.138.13.200')
userName = c_char_p('user')
passwd = c_char_p('user')
a= lib2.strncmp(address, userName, c_int(4))
a= lib2.strncmp(userName, address, 4)
a= lib2.strncmp(address2, address, 15)
lib2.printf('%d\n', ret_init)
lib2.printf('%s\n', address)
lib2.printf('%s\n', address1)
lib2.printf('%s\n', address2)
lib2.printf('%d\n', lib2.strlen(address))
lib2.printf('%d\n', lib2.strlen(address1))
lib2.printf('%d\n', lib2.strlen(address2))