2014-10-04 58 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