2011-07-11 1 views
4

printfを使用してstdoutに出力する簡単なCモジュールを作成しました。PythonでインポートしたときにC関数の標準出力をリダイレクトする問題

// sample.c 
func_print() 
{ 
    printf("Hello World!\n"); 
} 

その後、私はあまりにも私のPythonプログラムでfunc_printを使用することができるようにSWIGを使用して、このラッパーを作りました。このプログラムでは、stdoutをtextctrlウィジェットにリダイレクトしました。 printを使用して印刷したものは、textctrlウィジェットに正しく表示されます。私は(sample.pyから)C関数func_print()を呼び出すとき

# sample.py 
... 
sys.stdout = textctrl   # textctrl is a TextCtrl widget (wxPython). 
print 'Hello from Python!'  # prints in the textctrl widget, as expected. 

しかし、端末の代わりにtextctrlウィジェットに印刷します。

func_print()     # [Problem] prints to the terminal window, instead of the textctrl widget. 

どういうわけか、期待通りCモジュール内の関数のstdoutがリダイレクトされませんようです。これを解決するのを手伝ってください。ありがとうございました。

答えて

4

問題は、sys.stdoutはPythonオブジェクトであり、実際のCストリームまたはファイル記述子ではありません。 sys.stdout documentationから:

(これらのオブジェクトを変更すると、os.popen(で実行される プロセスの標準I/Oストリームには影響しません)、os.system()または 機能のEXEC *()ファミリosモジュールに。)

あなたのCコードは、その中でそれが唯一の出力のための伝統的なUnixファイルディスクリプタではなく、Pythonオブジェクトへのアクセス権を持っている、os.systemによって生成されたプロセスとは異なりではありません。

システムレベルでstdoutを別のファイルまたはソケットにリダイレクトする場合は、os.dup2を参照してください。

実際にCからのPythonオブジェクトに出力を送信する場合は、Calling Python Functions From Cを参照してください。

関連する問題