파일 설명자를 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를 변경하는 것을 여유가있을 수없는 경우
당연히, 모든 작동합니다.
Python과 DLL이 동일한 C 라이브러리 (msvcrt)를 사용하고 있습니까? (http://www.dependencywalker.com/은 한 가지 방법입니다.) – jdigital