我在ctypes和它的大部分工作包裝這個稱爲pvcam(光度計虛擬相機訪問方法)的C庫。問題是我無法讓圖書館無法啓動。當我試圖不確定它說,它從來沒有inited。 以下是有問題的代碼片段。python ctypes國外圖書館初始化和未初始化
libraw1394 = CDLL('libraw1394.so', mode=RTLD_GLOBAL)
libpvcam = CDLL('libpvcam.so', mode=RTLD_GLOBAL)
裝載庫後,我設置了pvcam_init()
功能
pl_pvcam_init = libpvcam.pl_pvcam_init
pl_pvcam_init.argtypes = []
pl_pvcam_init.restype = ctypes.c_int
def pvcam_init():
pl_pvcam_init()
if not pl_error_code():
return
else:
print('pl_pvcam_init() failed : '+error_message(error_code()))
和pvcam_uninit()
功能
pl_pvcam_uninit = libpvcam.pl_pvcam_uninit
pl_pvcam_uninit.restype = c_int
pl_pvcam_uninit.argtypes = []
def pvcam_uninit():
pl_pvcam_uninit()
if not pl_error_code():
return
else:
print('pl_pvcam_uninit() failed : '+error_message(error_code()))
這些error_code()
和error_message(error_code)
功能很簡單,他們似乎做工精細,以防萬一你需要看他們
pl_error_code = libpvcam.pl_error_code
pl_error_code.argtypes = []
pl_error_code.restype = c_int
def error_code():
error_code = pl_error_code()
return error_code
和
pl_error_message = libpvcam.pl_error_message
pl_error_message.restype = c_int
pl_error_message.argtypes = [c_int16,c_char_p]
def error_message(error_code):
char_msg = ' ' #large string to hold error description
pl_error_message(error_code, char_msg)
return char_msg
簡單pvcam_init()
隨後pvcam_uninit()
返回
pl_pvcam_uninit() failed : C0_PVCAM_NOT_INITED Camera library not initialized
即error_code()
和error_message(error_code)
正在:), 另外,如果我這樣做遵循了pvcam_init()
通過pvcam_init()
再次
pl_pvcam_init() failed : C2_PVCAM_ALREADY_INITED Init_pvcam has been called twice without closing
如果我只是繼續開放硬件和採集等,pvcam_init()
之後一切正常,直到我想關閉程序。爲什麼pvcam_uninit()
看不到pvcam_init()
?
的PVCAM API文檔是在這裏PVCAM 2.7 Software User Manual.pdf
加'error_message'應該使用一個可寫的緩衝區'char_msg =(ctypes.c_char * MSGSIZE)()'然後返回'char_msg.value'。不要修改Python字符串。 – eryksun 2014-10-05 04:57:16
我改變它來檢查pl_pvcam_uninit()的返回值,它似乎返回它執行得很好,所以我修改了函數來檢查函數調用返回的內容,然後僅當返回失敗時才檢查error_code。它現在似乎在工作。將進一步測試,謝謝 @eryksun請問我爲什麼不應該修改Python字符串?因爲我一直認爲如果我指定一個argtype爲c_char_p,我只需傳遞一個Python字符串並讓它被修改,只要確保字符串大小(即MSGSIZE)足夠大就可以實現即將發佈的內容。 – 2014-10-05 06:07:11
@ user3371330,基本上一個Python字符串是不可變的,當你違反這個契約時,你現在深入瞭解你作爲Python程序員不必擔心的實現細節。這就是爲什麼文檔告訴你使用'create_string_buffer'來代替。這是從初始化字符串中創建一個'c_char'數組的便利函數。我通常只是直接創建數組,如上所示。 – eryksun 2014-10-05 23:38:46