用python中的ctypes从.so文件链接时发生了奇怪的改变

2024-06-16 11:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的博士项目写一个程序来处理来自高速摄像机的数据。这个摄像头在Linux上附带了一个.so文件格式的SDK,用于与摄像头通信并获取图像。如前所述,它是一个高速摄像头,可传送大量数据(每分钟几GB)。直接用DMA格式的spool文件来处理数据量。 当我写一个小的C程序,链接.so文件并以这种方式调用spool函数时,这个函数工作得很好。但是当我用ctypes包装.so文件并从python调用函数时,除了spool函数之外,所有函数都正常工作。当我调用spool函数时,它没有返回任何错误,但是后台处理的数据文件被弄乱了,文件格式正确,但所有帧中有一半是0的。 在我的世界里,.so文件中的函数应该根据它从哪个程序调用而表现出不同的行为是没有意义的,我自己的小C程序还是python,毕竟这只是一个更大的C程序。从不同的程序调用.so时,有没有人知道什么是不同的?在

我将非常感谢你的任何建议

尽管摄像头是商用的,但有些驱动程序是GPLed的,并且可以使用,尽管有点复杂。(不幸的是不是spool函数)我在python中有一个对象用于Handel the camera。在

课程的开头是:

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))

相关函数为:

^{pr2}$

在相应的标题中显示:

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()

Tags: 文件数据函数self程序sousrlocal
1条回答
网友
1楼 · 发布于 2024-06-16 11:33:08

我的猜测是,它不是对后台处理函数本身的调用,而是一个调用序列,它会导致损坏的值被输入/从库中输入。在

你在64位平台上吗?不为任何返回64位整数(long)或指针的对象指定restype将导致这些值被自动截断为32位。此外,ctypes.c_voidp处理有点令人惊讶-ctypes.c_voidprestype值没有被截断,而是在Python解释器中以int类型返回,如果没有强制转换就将高位指针作为参数反馈给其他函数,则会产生可预见的有趣结果。在

我还没有对其进行测试,但这两种情况都可能会影响32位平台的值大于系统最大值. 在

要100%确定您正在传递和接收预期值的唯一方法是为您调用的所有函数指定argtypes和{}。这包括为所有这些函数操作的Structure类和相关的POINTER创建这些函数的操作,甚至是不透明的struct

相关问题 更多 >