4

我编写了一个简单的 C 模块,它使用 printf 打印到标准输出。

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

后来,我围绕它做了一个包装器,SWIG这样我也可以func_print在我的 python 程序中使用。在这个程序中,我已将标准输出重定向到一个 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 模块中的 for 函数似乎stdout没有按预期重定向。请帮我解决这个问题。谢谢你。

4

1 回答 1

5

您的问题是这sys.stdout是一个 Python 对象,而不是实际的 C 流或文件描述符。从sys.stdout 文档

(更改这些对象不会影响由 os.popen()、os.system() 或 os 模块中的 exec*() 系列函数执行的进程的标准 I/O 流。)

您的 C 代码与由 生成的进程没有什么不同os.system,因为它只能访问传统的 Unix 文件描述符以进行输出,而不是 Python 对象。(好吧,无论如何,并非没有一些额外的工作。)

如果您只想将系统级别的标准输出重定向到另一个文件或套接字,请参阅os.dup2

但如果您真的想从 C 向 Python 对象发送输出,请参阅Calling Python Functions From C

于 2011-07-13T05:32:13.040 回答