2012-02-08 6 views
6

ファイル記述子を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を変更する余裕がない場合


勿論、すべてが動作します。

+1

PythonとDLLの両方で同じCライブラリ(msvcrt)が使用されていますか? (http://www.dependencywalker.com/はチェックする一つの方法です)。 – jdigital

答えて

4

WindowsはUnixのようなファイル記述を使用しないので、私はファイル記述子がCランタイムによってエミュレートされていると仮定しています。 2つの異なるCランタイムを使用している場合(たとえば、EXEとDLLが異なるコンパイラでコンパイルされている場合や、同じコンパイラで異なるオプションでコンパイルされている場合)、各ランタイムには独自の「ファイルディスクリプタエミュレーション」があり、ディスクリプタを一方から他方に渡す。

+0

pythonは9.0でコンパイルされているようですが、私のdllは10.0を使います。しかし、私はまだOSファイルハンドルとCランタイムファイル記述子を別の獣であるとみなしています。 9.0と10.0のランタイムを一緒に使用していますが、私のfd "エミュレータ"が同じOSファイルハンドルにマップされるべきではありませんか? – user237419

+0

それとも、各ランタイムにfdsをOSファイルハンドルにマッピングする独自の「ディスクリプタテーブル」がありますか?この場合、エラーは私のfdがcrt90のテーブルにあり、crt10のテーブルでそれを探しているので意味があります。これはどうですか?おかげでjdigital! – user237419

+0

私は既に私の質問に答えたと思うが、 "仮説"デコレータは私にもっと申し訳ない。 – user237419

関連する問題