ファイル記述子をctypesを通して、fdで書き込みが行われるC関数に渡そうとしています。 Linux上で動作します。 Windowsではそれがないと、なぜ(私はWindows上で開発者としての経験がない)Windows上のctypesを通じてファイル記述子をCライブラリ関数に渡します。
//C func signature:
void fun(struct bah *opaque, int fd)
のpythonから(詳細は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(...))
プログラムが書き込みに死にます( )S失敗アサーション_osfile有する(FH)& FOPEN
CL.EXE:x86用16.00.40219.01 のPython 2.7.2 MSCのv.1500 32ビット
HO私はそれをやろうとしているのですか?いいえ、私はlibにopen()をオフロードしたくありません。私はすでに開いているファイル記述子を、プラットフォームに依存しない安全な方法で渡したいと思います。
追加情報、念のために: ライブラリがtinycdbですが、私はgetoptのとDLLの輸出を動作させるために、短いcmakeの仕様と窓といくつかの汚いパッチに迅速にそれを移植しました。ライブラリとexeツールは期待通りに動作します(テスト済み)。 tinycdb用のPython ctypesラッパーは、期待通りにLinux上で動作します。窓は私に眼球を与える。彼は独自の(msvcrt)_open libcallでオープンした後でも、fdが有効な記述子であることを受け入れません。私は()ING /クローズ()ライブラリ内のファイルをINGのオープンだが、私はAPIを変更する余裕がない場合
勿論、すべてが動作します。
PythonとDLLの両方で同じCライブラリ(msvcrt)が使用されていますか? (http://www.dependencywalker.com/はチェックする一つの方法です)。 – jdigital