3

Pythonバージョン=2.7、Windows

やあ、

私のPythonスクリプトは共有Cライブラリを使用しており、次の例のように、スクリプトと共有Cライブラリの標準IOをファイルにリダイレクトしたいと思います(stderrストリームに限定)

C共有ライブラリコード:

#include <stdio.h>

void my_print(void)
{
    fprintf(stderr, "This string isn't displayed\n");
}

Pythonスクリプト:

import os, sys, ctypes

def test():
    parserDll = ctypes.CDLL("./titi.dll")           # my shared C library
    file_stderr_fds = os.open("./toto.txt", 777)    # file in which redirect the stderr
    saved_stderr_fds = os.dup(2)                    # Backup stderr
    os.dup2(file_stderr_fds, 2)                     # Redirect stderr to file
    print >> sys.stderr, "zozo"                     # Python test redirect for Python script --> Ok
    parserDll.my_print(None)                        # test for the shared C library --> KO

if __name__ == "__main__":
    test()

このPythonスクリプトを実行すると、toto.txtファイルで「zozo」(Pythonスクリプトから表示)を読み取りましたが、共有Cライブラリからは何も読み取りませんでした。ただし、os.dup2()をコメントアウトすると、両方の文字列がコンソールに表示されます。なんで?使用されるPythonスクリプトと共有Cライブラリの標準IOは同じではありませんか?この場合、どうすれば両方を同じファイルにリダイレクトできますか?

4

1 に答える 1

0

サンプルを Linux で実行すると、問題なく動作します。

ほとんどの場合、Windows は実装に POSIX ファイル記述子を実際には使用しないため、stdioそれらを変更しても影響を受けません。Windows が実際に POSIX ファイル記述子をどのように実装しているかを正確に知っているとは言えませんlibcが、それはおそらく Windows がネイティブで使用するものの上にある POSIX 互換機能の互換レイヤーであり、stdioコードはおそらくそれらをまったく使用していません。

とにかく、の後ろでファイル記述子を切り替えるのは、ちょっとしたハックのように思えますstdioFILE *おそらく、C 関数がロギングに使用できる明示的な変数を使用する必要があると思います。代わりに、Python からの明示的な呼び出しで切り替える必要があります。

于 2012-12-23T03:17:31.780 に答える