2010-06-28 25 views
5

Umarım bu önemsizdir ve sadece derslerde bulamadım. Ben 'denetler' c kodu python kod yazıyor, ben python gelen ctypes ile c kodu çalıştırın. Şimdi c kodu tarafından çıkarılan verileri işlemek için c 'printfs' 'yakalamak' istiyorum. Bunu nasıl yapacağını bilen var mı?Python'da ctypes ile printf nasıl yakalanır?

Teşekkür

+0

C printf'i Python'a aşırı yüklemek mi istiyorsunuz? – luc

+0

Aşırı yükleme, hangi işletim sisteminde? – Arlaharen

+0

Aşırı yükleme problemimi çözerse, denerim. Ubuntu 9.10 kullanıyorum. – Framester

cevap

0

Eh printf basitçe ne olursa olsun hiç stdout dosya işaretçisi belirtir çıktısını yazdığı. C programını nasıl yürüttüğünüzden emin değilim, ancak C programının stdout'u Python'da okuyabileceğiniz bir şeye yönlendirmek mümkün olmalıdır.

2

stdout'u arayarak C kodunuzdan yazabilirsiniz, daha sonra çıktı değerini işleyebilirsiniz.

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__ 

Ancak, C koduna bir tampon geçmek daha kolay ve daha hoş olurdu ve printf çıkış değerlerini -ing yerine sağlanan tampon bunları yazardım.

Veya daha iyisi, sen, C kodu içinde bunun için bellek ayrılamadı, byref bir c_char_p geçmesi ardından Python yılında tampon kullanmak çıkış değeri ile tampon güncelleyebilirsiniz. Belleği ayırmayı unutmayın (free işlevi için ctypes sarıcı yapmalısınız).

+0

'Stdout'un müdahalesi aklımda olan şeydi. Ama benim için çalışmıyor. Kod, çıkış davranışını değiştirmez. – Framester

+0

Gerçekten ne demek istediğini anlamıyorum * kod çıktı davranışını değiştirmez *. Neyi başarmaya çalıştığınıza dair daha ayrıntılı bir açıklama ve 'stdout' yönlendirme ile karşılaştığınız sorunlar bize nasıl yardımcı olabileceğimize dair bir ipucu verebilir. –

+0

Kendimi yeterince açıklayamadığım için üzgünüm. 'Stdout'u engellemek için kod satırlarını ekledim, fakat Python'da bulunan ctypes ile çağırdığım c fonksiyonlarının' printfs 'terminalinde hala çıktı. Cevabımda problemimin daha somut bir tanımını ekleyeceğim. – Framester