python ctypes国外图书馆初始化和未初始化
问题描述:
我在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
答
根据API文档,pl_pvcam_init()
返回 “TRUE成功,FALSE的失败。失败设置 pl_error_code
”。
我对这个库不太了解,但如果pl_pvcam_init()
的调用成功,那么很有可能pl_error_code
未设置/无效。因此,您应该在致电error_code()
和error_message()
之前检查其返回值。
加'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