2010-06-28 34 views
5

我希望這是微不足道的,我只是沒有在教程中找到它。我正在編寫'監督'c代碼的python代碼,也就是我用python中的ctypes運行c代碼。現在我想'捕捉'c'printfs'來處理由c代碼輸出的數據。任何想法如何做到這一點?如何在ctypes中用python抓住c printf?

感謝

+0

你想在Python中重載C printf嗎? – luc 2010-06-28 12:12:46

+0

如果超載,在什麼操作系統上? – Arlaharen 2010-06-28 12:26:23

+0

如果超載可以解決我的問題,我會嘗試。我使用Ubuntu 9.10。 – Framester 2010-06-28 18:20:28

回答

0

printf簡單地將其輸出到任何的stdout文件指針指。我不知道你是如何執行C程序的,但應該可以將C程序的stdout重定向到你可以用Python讀取的東西。

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 -ing的輸出值,你會寫他們在提供的緩衝區。

或者,更好的是,你可以通過一個byrefc_char_p,爲它分配C代碼中的內存中,更新與輸出值的緩衝區然後使用緩衝區Python。不要忘記取消分配內存(您應該爲free函數創建一個​​包裝)。

+0

'stdout'的截取是我想到的。但它不適合我。該代碼不會更改輸出行爲。 – Framester 2010-06-28 18:19:36

+0

我不明白你的意思*代碼不會改變輸出行爲*。提供更詳細的解釋,說明你想要達到的目標以及你使用'stdout'重定向遇到的問題,可能會給我們提示我們如何能夠幫助你。 – 2010-06-28 21:11:00

+0

抱歉沒有讓自己清楚。我添加了代碼行來攔截'stdout',但是我用Python中的ctypes調用的c函數的'printfs'仍然在終端輸出。我會在答案中加入更具體的問題描述。 – Framester 2010-06-29 07:59:33