나는 Ph.D.에 대한 고속 카메라의 데이터를 처리하는 프로그램을 작성하고 있습니다. 계획. 이 카메라에는 Linux에서 .so 파일 형태로 SDK가 제공되어 카메라와 통신하고 이미지를 가져옵니다. 마찬가지로 그것은 많은 양의 데이터를 제공하는 고속 카메라입니다 (분당 몇 GB). 이 양의 데이터를 처리하기 위해 SDK에는 USB를 통해 하드 드라이브에 직접 데이터를 스풀링하는 매우 편리한 스풀 기능이 있습니다. FITS 파일은 천문학에서 사용되는 헤더가있는 원시 바이너리 형식입니다. 이 함수는 작은 C 프로그램을 작성하고 .so 파일을 링크하고 스풀 함수를이 방법으로 호출 할 때 잘 작동합니다. 그러나 .so 파일을 ctypes로 감싸고 파이썬에서 함수를 호출하면 스풀 함수를 제외한 모든 함수가 작동합니다. 스풀 함수를 호출하면 오류는 반환되지 않지만 스풀 된 데이터 파일이 깨져서 파일이 올바른 형식을 갖지만 모든 프레임의 절반이 0입니다. 제 세상에서 .so 파일의 함수가 호출 된 프로그램, 내 자신의 작은 C 프로그램 또는 결국 더 큰 C 프로그램 일 뿐인 비단뱀에 따라 다르게 동작해야한다는 것은 의미가 없습니다. 다른 프로그램에서 .so를 호출 할 때 어떤 신체가 다른지에 대한 단서가 있습니까?python에서 ctypes로 .so 파일을 연결할 때 이상한 동작 변경
나는 조금 복잡하지만, 어떤 제안
카메라가 상업적에도 불구하고, 일부 드라이버가 · 배타적하고 있습니다
매우 감사 할 것입니다. (불행히도 스풀 함수가 아닌 것 같다.) 나는 파이썬에서 카메라를 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))
관련 기능을 읽
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);
코드가 얻을 :
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]
그리고 해당 헤더에 읽기
카메라를 실행하면 다음과 같이 표시됩니다 :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()
'argtypes'과'restype' 속성을'ctypes' 코드에 올바르게 설정 하시겠습니까? 코드와 관련 C 헤더 파일을 보여줄 수 있다면 도움이 될 것입니다. –
라이브러리는 순수한 C 빌드 (또는 테스트되지 않은 다른 컴파일러/플랫폼)에서 노출되지 않는 방식으로 버그가있을 수 있습니다. 당신이 불투명 한 공유 객체에 얽매여있는 것처럼 들리 겠지만, 하나의 함수를 C로 감싸서 서브 프로세스로 만들고 싶을 수도 있습니다. 래퍼에 버그가있을 수도 있지만 결코 그런 일이 발생하지는 않습니다.) – msw
코드에 세부 정보를 추가했습니다. 서브 프로세스 문제는 드라이브가 카메라 냉각 등을 담당한다는 것입니다. 그래서 나는 그것을 계속 유지해야하며, 내가 볼 수있는 한 그것을로드 한 프로세스에서만 명령을 보낼 수 있습니다. 파이썬 코드에서 다중 처리 모듈을 사용하여 카메라의 처리를 분리하고,이 모듈이 C 유형을 통해 코드를 연결하여 트릭을 재생할 수 있는지 확인합니다. –