2011-07-11 30 views
4

我寫了一個簡單的C模塊打印到標準輸出使用printf。問題重定向標準輸出的Python函數stdout

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

後來,我做了這周圍的包裝使用SWIG,這樣我可以用我的Python程序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. 

然而,當我調用C函數func_print()(來自sample.py),其打印到終端而不是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(),使用os.system()或EXEC *()的 系列函數執行 過程的I/O流在OS模塊。)

你的C代碼是沒有什麼不同的os.system催生了一個過程,它只能訪問輸出傳統的Unix文件描述符,而不是Python對象。 (好吧,無論如何,不​​是沒有額外的工作。)

如果您只是想在系統級別將stdout重定向到另一個文件或套接字,請參閱os.dup2

但是,如果您確實想將輸出發送到C的Python對象,請參閱Calling Python Functions From C