2010-06-28 25 views
5

Mam nadzieję, że to jest trywialne i po prostu nie znalazłem tego w tutorialach. Piszę kod Pythona, który "nadzoruje" kod c, aka I uruchomić kod c z ctypes z Pythona. Teraz chcę "złapać" c 'printfs', aby przetworzyć dane, które są wyprowadzane przez kod c. Masz pojęcie, jak to zrobić?Jak "złapać" c printf w python z ctypes?

Dzięki

+0

Czy chcesz przeładować printf C w Pythonie? – luc

+0

Jeśli przeciążasz, na jakim systemie operacyjnym? – Arlaharen

+0

Jeśli przeciążenie rozwiąże mój problem, spróbuję. Używam Ubuntu 9.10. – Framester

Odpowiedz

0

Well printf prostu pisze swoje wyjście na cokolwiek wskaźnik stdout plik dotyczy. Nie jestem pewien, jak wykonujesz program C, ale powinno być możliwe przekierowanie programu C stdout do czegoś, co możesz przeczytać w Pythonie.

2

Można przechwycić kod stdout przed zapisaniem go z kodem C, a następnie przetworzyć wartość wyjściową.

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__ 

Jednak byłoby łatwiej i ładniej przekazać bufor do kodu C, a zamiast printf -ing wartości wyjściowe można zapisać je w dostarczonym buforze.

Albo, jeszcze lepiej, można przejść do c_char_pbyref, przydzielić pamięci dla niego wewnątrz kodu C zaktualizować bufor z wartością wyjściową a następnie użyć bufor w Python. Nie zapomnij zwolnić pamięci (powinieneś utworzyć opakowanie ctypes dla funkcji free).

+0

Przechwycenie "stdout" jest tym, co miałem na myśli. Ale to nie działa dla mnie. Kod nie zmienia zachowania wyjściowego. – Framester

+0

Naprawdę nie rozumiem, co masz na myśli przez * kod nie zmienia zachowania wyjściowego *. Dostarczenie bardziej szczegółowego wyjaśnienia, co próbujesz osiągnąć, oraz problemów, które napotykasz podczas przekierowania na "stdout", może dać nam wskazówkę, w jaki sposób możemy Ci pomóc. –

+0

Przepraszam, że nie wyraziłem się wystarczająco jasno. Dodałem linie kodu, aby przechwycić "standardowe wyjście", ale "printfs" funkcji c, które wywołuję za pomocą ctypes w Pythonie, jest nadal wyprowadzane w terminalu. Dodam bardziej konkretny opis mojego problemu w odpowiedzi. – Framester