我希望這是微不足道的,我只是沒有在教程中找到它。我正在編寫'監督'c代碼的python代碼,也就是我用python中的ctypes運行c代碼。現在我想'捕捉'c'printfs'來處理由c代碼輸出的數據。任何想法如何做到這一點?如何在ctypes中用python抓住c printf?
感謝
我希望這是微不足道的,我只是沒有在教程中找到它。我正在編寫'監督'c代碼的python代碼,也就是我用python中的ctypes運行c代碼。現在我想'捕捉'c'printfs'來處理由c代碼輸出的數據。任何想法如何做到這一點?如何在ctypes中用python抓住c printf?
感謝
好printf
簡單地將其輸出到任何的stdout
文件指針指。我不知道你是如何執行C程序的,但應該可以將C程序的stdout
重定向到你可以用Python讀取的東西。
您可以在從您的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的輸出值,你會寫他們在提供的緩衝區。
或者,更好的是,你可以通過一個byref
c_char_p
,爲它分配C
代碼中的內存中,更新與輸出值的緩衝區然後使用緩衝區Python
。不要忘記取消分配內存(您應該爲free
函數創建一個包裝)。
'stdout'的截取是我想到的。但它不適合我。該代碼不會更改輸出行爲。 – Framester 2010-06-28 18:19:36
我不明白你的意思*代碼不會改變輸出行爲*。提供更詳細的解釋,說明你想要達到的目標以及你使用'stdout'重定向遇到的問題,可能會給我們提示我們如何能夠幫助你。 – 2010-06-28 21:11:00
抱歉沒有讓自己清楚。我添加了代碼行來攔截'stdout',但是我用Python中的ctypes調用的c函數的'printfs'仍然在終端輸出。我會在答案中加入更具體的問題描述。 – Framester 2010-06-29 07:59:33
你想在Python中重載C printf嗎? – luc 2010-06-28 12:12:46
如果超載,在什麼操作系統上? – Arlaharen 2010-06-28 12:26:23
如果超載可以解決我的問題,我會嘗試。我使用Ubuntu 9.10。 – Framester 2010-06-28 18:20:28