2012-02-08 2 views
6

파일 설명자를 ctypes를 통해 전달하고 C 함수를 작성하여 fd에서 수행합니다. 리눅스에서 작동합니다. 창에 그렇지 않습니다 왜 (나는 창문에 개발자로 경험이 없음)Windows의 ctypes를 통해 C 라이브러리 함수에 파일 설명자를 전달합니다.

//C func signature: 
void fun(struct bah *opaque, int fd) 

파이썬에서 (자세한 내용은 ommited) 이해가 안 :

mylib.fun.argtypes = [POINTER(bah), c_int] 
fh = open(filename,'wb') 
#doesn't work on windows, works on linux/unix 
mylib.fun(some_ctypes_struct, fh.fileno()) 
#doesn't work on windows 
mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK) 
#doesn't work 
mylib.fun(bah_struct, os.open(...)) 

프로그램이 쓰기에 사망 ()의 실패한 주장 _osfile와 (FH) & FOPEN

CL.EXE : x86 용 16.00.40219.01 파이썬 2.7.2 석사 v.1500 32 비트

호 내가해야만 해? 아니, 나는 lib에 open()을 오프로드하고 싶지 않다. 플랫폼 독립적 인 안전한 방식으로 이미 열려있는 파일 설명자를 전달하려고합니다. 다만 경우에


추가 정보 : 라이브러리가 tinycdb이다, 나는 getopt에와 DLL 수출 작업을하기 위해 짧은 cmake 사양과 몇 더러운 패치 창에 빠르게 포팅. 라이브러리 및 exe 도구는 예상대로 작동합니다 (테스트 된). tinycdb 용 파이썬 ctypes 랩퍼는 예상대로 Linux에서 작동합니다. 창문들이 나에게 시선을 준다. 그는 자신의 (msvcrt) _open libcall로 여는 후에도 fd가 유효한 설명 자임을 받아들이지 않을 것입니다. 나는() ING/닫기() 라이브러리에서 파일을 보내고 열려있어하지만 난 API를 변경하는 것을 여유가있을 수없는 경우


당연히, 모든 작동합니다.

+1

Python과 DLL이 동일한 C 라이브러리 (msvcrt)를 사용하고 있습니까? (http://www.dependencywalker.com/은 한 가지 방법입니다.) – jdigital

답변

4

Windows는 유닉스와 같은 파일 설명을 사용하지 않으므로 파일 설명자가 C 런타임에서 에뮬레이트된다는 가정을 세웠습니다. 두 개의 다른 C 런타임 (예를 들어, EXE와 DLL이 다른 컴파일러로 컴파일되거나 같은 컴파일러로 옵션이 다른 경우), 각 런타임마다 고유 한 "파일 디스크립터 에뮬레이션"이 있으며, 한 디스크립터에서 다른 디스크립터로 디스크립터를 전달한다.

+0

파이썬은 9.0으로 컴파일 된 것으로 보이고, 내 dll은 10.0을 사용합니다. 그러나 나는 여전히 OS 파일 핸들과 C 런타임 파일 디스크립터를 다른 짐승으로 간주하고있다. 9.0과 10.0 런타임을 함께 사용하고 있습니다. 동일한 OS 파일 핸들에 내 fd "에뮬레이터"맵핑을해서는 안됩니까? – user237419

+0

또는 각 런타임에 OS 파일 핸들에 fds를 매핑하는 자체 "디스크립터 테이블"이 있습니까? 이 경우 오류는 내 fd가 crt90의 테이블에 있고 crt10의 테이블에서 검색 중이므로 의미가 있습니다. 이게 어떻게 작동하는거야? 감사합니다 jdigital! – user237419

+0

당신은 이미 내 질문에 답한 것 같지만 "가설"데코레이터는 더 많은 것을 요구합니다. 미안합니다. – user237419

관련 문제