[英]Strange altered behaviour when linking from .so file with ctypes in python
我正在为我的博士学位编写一个程序来处理来自高速相机的数据。 项目。 本相机在Linux上带有.so文件形式的SDK,用于与相机进行通信并获取图像。 如前所述,这是一台高速摄像机,可传输大量数据(每分钟数GB)。 为了处理大量数据,SDK具有非常方便的后台处理功能,该功能通过FITS文件的形式通过DMA将数据直接后台处理到硬盘驱动器,FITS文件是具有二进制的原始二进制格式,带有在天文学中使用的标头。 当我编写一个小型C程序,链接.so文件并以这种方式调用假脱机函数时,此函数可以正常工作。 但是,当我用ctypes包装.so文件并从python调用函数时,除假脱机函数外,所有函数均正常工作。 当我调用假脱机函数时,它不返回任何错误,但是假脱机的数据文件出现乱码,该文件具有正确的格式,但所有帧的一半为0。 在我的世界中,.so文件中的函数的行为不同,这取决于它是从哪个程序(我自己的小C程序或python毕竟是更大的C程序)中调用而引起的。 从不同程序中调用.so时,有什么机构有什么不同的线索?
我将非常感谢您的任何建议
即使相机是商用相机,也有些驱动程序已经过GPL授权并可以使用,尽管有点复杂。 (不幸的是,它似乎不是假脱机功能)我在python中有一个对象,用于Handel相机。
该课程的开头为:
class Andor:
def __init__(self,handle=100):
#cdll.LoadLibrary("/usr/local/lib/libandor.so")
self.dll = CDLL("/usr/local/lib/libandor.so")
error = self.dll.SetCurrentCamera(c_long(handle))
error = self.dll.Initialize("/usr/local/etc/andor/")
cw = c_int()
ch = c_int()
self.dll.GetDetector(byref(cw), byref(ch))
相关功能为:
def SetSpool(self, active, method, path, framebuffersize):
error = self.dll.SetSpool(active, method, c_char_p(path), framebuffersize)
self.verbose(ERROR_CODE[error], sys._getframe().f_code.co_name)
return ERROR_CODE[error]
并在相应的标头中显示为:
unsigned int SetSingleTrackHBin(int bin);
unsigned int SetSpool(int active, int method, char * path, int framebuffersize);
unsigned int SetStorageMode(at_32 mode);
unsigned int SetTemperature(int temperature);
使摄像机运行的代码如下所示:
cam = andor.Andor()
cam.SetReadMode(4)
cam.SetFrameTransferMode(1)
cam.SetShutter(0,1,0,0)
cam.SetSpool(1,5,'/tmp/test.fits',10);
cam.GetStatus()
if cam.status == 'DRV_IDLE':
acquireEvent.clear()
cam.SetAcquisitionMode(3)
cam.SetExposureTime(0.0)
cam.SetNumberKinetics(exposureNumber)
cam.StartAcquisition()
我的猜测是,这不是对假脱机函数本身的调用,而是一个调用序列,该调用序列导致损坏的值被送入/从库中馈送。
您是否在64位平台上? 如果不为返回64位整数(带有gcc的long
整数)或指针的任何东西指定restype
,则将导致这些值被静默截断为32位。 此外, ctypes.c_voidp
处理有点令人惊讶ctypes.c_voidp
restype
值不会被截断,但在Python解释器中将返回为int
类型,如果高指针作为其他函数的参数反馈给其他函数的参数,则返回的结果很可笑投。
我尚未对其进行测试,但是这两个条件都可能会影响32位平台(其值大于sys.maxint)。
100%确定要传递和接收期望值的唯一方法是为所有调用的函数指定argtypes
和restype
。 并且包括为那些功能在其上运行的所有struct
(甚至是不透明的struct
创建Structure
类和关联的POINTER
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.