2014-08-27 2 views
0

.so 라이브러리를 파이썬 코드로 가져 와서 C 함수를 사용하려고합니다. 사용을 생각합니다C 헤더 파이썬

from ctypes import * 
import ctypes 
lib = CDLL('./libcaenhvwrapper.so.5.56') 

잘 작동합니다. 헤더 파일 에 정의 된 일부 사용자 정의 유형을 사용해야하지만 액세스 할 수 없습니다.

는 종류가 .so 파일 ctypes 모듈로드에없는 사전

답변

0

에 감사합니다. 심지어 C.에서

C 유형은, 그들이 헤더에 선언하고 그런 식으로 작동하지 않습니다 당신은 (C) 라이브러리를 사용하는 헤더가 있어야합니다

사용해야 할거야

다양한 ctypes API를 사용하여 Python으로 유형을 다시 만들 수 있습니다. structunion 유형의 작업 방법은 this part of the tutorial을 참조하십시오.

0

이제 내 코드는 일반 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))