2010-05-21 2 views
2

나는 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() 
+1

'argtypes'과'restype' 속성을'ctypes' 코드에 올바르게 설정 하시겠습니까? 코드와 관련 C 헤더 파일을 보여줄 수 있다면 도움이 될 것입니다. –

+0

라이브러리는 순수한 C 빌드 (또는 테스트되지 않은 다른 컴파일러/플랫폼)에서 노출되지 않는 방식으로 버그가있을 수 있습니다. 당신이 불투명 한 공유 객체에 얽매여있는 것처럼 들리 겠지만, 하나의 함수를 C로 감싸서 서브 프로세스로 만들고 싶을 수도 있습니다. 래퍼에 버그가있을 수도 있지만 결코 그런 일이 발생하지는 않습니다.) – msw

+0

코드에 세부 정보를 추가했습니다. 서브 프로세스 문제는 드라이브가 카메라 냉각 등을 담당한다는 것입니다. 그래서 나는 그것을 계속 유지해야하며, 내가 볼 수있는 한 그것을로드 한 프로세스에서만 명령을 보낼 수 있습니다. 파이썬 코드에서 다중 처리 모듈을 사용하여 카메라의 처리를 분리하고,이 모듈이 C 유형을 통해 코드를 연결하여 트릭을 재생할 수 있는지 확인합니다. –

답변

0

내 생각에 스풀링 함수 자체에 대한 호출이 아니라 호출 값이 손상되어 라이브러리에서주고받는 호출 시리즈입니다.

64 비트 플랫폼을 사용하고 계십니까? 64 비트 정수 (long with gcc) 또는 포인터를 반환하는 항목에 restype을 지정하지 않으면 해당 값이 자동으로 32 비트로 잘립니다. 덧붙여 ctypes.c_voidp 처리는 약간 놀랍습니다. 값은 잘리지 않지만, 높은 포인터가 매개 변수로 형변환없이 다른 기능에 피드백되면 예상대로 재미있는 결과가 나오는 형태로 파이썬 인터프리터에서 int으로 반환됩니다.

아직 테스트하지 않았지만이 두 조건은 sys.maxint보다 큰 값의 경우 32 비트 플랫폼에도 영향을 미칠 수 있습니다.

사용자가 기대하는 값을 전달하고 수신하는 유일한 방법은 사용자가 호출하는 모든 기능에 대해 argtypesrestype을 지정하는 것입니다. 여기에는 Structure 클래스를 생성하고 해당 함수가 모두 struct 인 경우에 POINTER을 포함합니다. 심지어는 불투명도가 struct입니다.