繁体   English   中英

从.so文件与python中的ctypes链接时发生奇怪的更改行为

[英]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%确定要传递和接收期望值的唯一方法是为所有调用的函数指定argtypesrestype 并且包括为那些功能在其上运行的所有struct (甚至是不透明的struct创建Structure类和关联的POINTER

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM