2014-10-04 59 views
0

我在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

回答

1

根據API文檔,pl_pvcam_init()返回 「TRUE成功,FALSE的失敗。失敗設置 pl_error_code」。

我對這個庫不太瞭解,但如果pl_pvcam_init()的調用成功,那麼很有可能pl_error_code未設置/無效。因此,您應該在致電error_code()error_message()之前檢查其返回值。

+0

加'error_message'應該使用一個可寫的緩衝區'char_msg =(ctypes.c_char * MSGSIZE)()'然後返回'char_msg.value'。不要修改Python字符串。 – eryksun 2014-10-05 04:57:16

+0

我改變它來檢查pl_pvcam_uninit()的返回值,它似乎返回它執行得很好,所以我修改了函數來檢查函數調用返回的內容,然後僅當返回失敗時才檢查error_code。它現在似乎在工作。將進一步測試,謝謝 @eryksun請問我爲什麼不應該修改Python字符串?因爲我一直認爲如果我指定一個argtype爲c_char_p,我只需傳遞一個Python字符串並讓它被修改,只要確保字符串大小(即MSGSIZE)足夠大就可以實現即將發佈的內容。 – 2014-10-05 06:07:11

+1

@ user3371330,基本上一個Python字符串是不可變的,當你違反這個契約時,你現在深入瞭解你作爲Python程序員不必擔心的實現細節。這就是爲什麼文檔告訴你使用'create_string_buffer'來代替。這是從初始化字符串中創建一個'c_char'數組的便利函數。我通常只是直接創建數組,如上所示。 – eryksun 2014-10-05 23:38:46