4

printf を使用して stdout に出力する単純な C モジュールを作成しました。

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

後で、Python プログラムでもSWIG使用できるように、これを使用してラッパーを作成しました。func_printこのプログラムでは、stdout を textctrl ウィジェットにリダイレクトしました。期待どおり、使用してprint印刷したものはすべて、textctrl ウィジェットに正しく印刷されます。

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

ただし、func_print()(sample.py から) C 関数を呼び出すと、textctrl ウィジェットではなく端末に出力されます。

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

どういうわけか、stdoutC モジュールの for 関数が期待どおりにリダイレクトされないようです。これを修正するのを手伝ってください。ありがとうございました。

4

1 に答える 1

5

問題はsys.stdout、Pythonオブジェクトであり、実際のCストリームやファイル記述子ではないことです。sys.stdoutドキュメントから:

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

Cコードはos.system、Pythonオブジェクトではなく、出力用の従来のUnixファイル記述子にのみアクセスできるという点で、によって生成されたプロセスと同じです。(まあ、とにかく、いくつかの余分な作業なしではありません。)

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

ただし、本当にCからPythonオブジェクトに出力を送信する場合は、「CからのPython関数の呼び出し」を参照してください。

于 2011-07-13T05:32:13.040 に答える