2011-07-11 28 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