在Python中导入C函数时重定向stdout的问题

4 投票
1 回答
1430 浏览
提问于 2025-04-16 21:17

我写了一个简单的C模块,它使用printf函数向标准输出(stdout)打印信息。

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

后来,我用SWIG为这个模块做了一个包装,这样我就可以在我的Python程序中使用func_print了。在这个程序里,我把标准输出重定向到了一个文本控件(textctrl)上。用print打印的任何内容都能正确显示在这个文本控件里,正如我预期的那样。

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

但是,当我从sample.py调用C函数func_print()时,它却在终端上打印,而不是在文本控件里。

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

看起来C模块中的函数的stdout没有像预期那样被重定向。请帮我解决这个问题。谢谢。

1 个回答

5

你的问题在于,sys.stdout 是一个Python对象,而不是一个真正的C语言流或文件描述符。根据sys.stdout的文档

(改变这些对象不会影响通过os.popen()、os.system()或os模块中的exec*()系列函数执行的进程的标准输入输出流。)

你的C代码和通过os.system启动的进程很相似,因为它只能访问传统的Unix文件描述符来输出,而不能直接使用Python对象。(当然,如果想要使用Python对象的话,需要做一些额外的工作。)

如果你只是想在系统层面上将标准输出重定向到另一个文件或套接字,可以查看os.dup2

但如果你真的想从C代码向Python对象发送输出,可以参考从C调用Python函数

撰写回答