如何使用ctypes在Python中“捕获”C printf?

5
我希望这很简单,只是我在教程中没有找到。我正在编写Python代码来“监视”C代码,也就是我用ctypes从Python运行C代码。现在我想“捕获”C语言的“printfs”以处理由C代码输出的数据。有任何想法如何做到这一点吗?谢谢。

你想在Python中重载C printf吗? - luc
如果重载可以解决我的问题,我会尝试。我使用Ubuntu 9.10。 - Framester
2个回答

2
您可以在 C 代码将 stdout 写入之前截取它,然后处理输出值。
import sys
import StringIO

buffer = StringIO.StringIO()

# redirect stdout to a buffer
sys.stdout = buffer

# call the c code with ctypes
# process the buffer

# recover the old stdout
sys.stdout = sys.__stdout__

然而,将缓冲区传递给C代码会更容易和更好,而且不需要使用printf输出值,您可以将其写入提供的缓冲区。
或者更好的方法是,您可以通过byref传递一个c_char_p,在C代码中为其分配内存,更新缓冲区以输出值,然后在Python中使用该缓冲区。不要忘记释放内存(您应该为free函数创建一个ctypes包装器)。

拦截“stdout”是我想到的方法。但是它并不适用于我。代码没有改变输出行为。 - Framester
我不太明白你所说的“代码没有改变输出行为”的意思。如果您提供更详细的解释,说明您试图实现什么以及在stdout重定向方面遇到了什么问题,那么我们可能会有所帮助。 - the_void
抱歉我的表述不够清晰。我添加了拦截“stdout”的代码,但是在Python中使用ctypes调用的c函数的“printfs”仍然输出在终端上。我将在答案中添加更具体的问题描述。 - Framester

0

printf 简单地将其输出写入到 stdout 文件指针所指向的位置。我不确定您是如何执行 C 程序的,但应该可以将 C 程序的 stdout 重定向到您可以在 Python 中读取的某个位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接