2010-06-28 5 views
5

Ich hoffe, das ist trivial und ich habe es einfach nicht in den Tutorials gefunden. Ich schreibe Python-Code, der C-Code "überwacht", alias ich führe den C-Code mit Ctypes von Python aus. Jetzt möchte ich die c 'printfs "fangen", um die Daten zu verarbeiten, die vom c-Code ausgegeben werden. Irgendeine Idee, wie man das machen würde?Wie c Printf in Python mit Ctypes "fangen"?

Dank

+0

Möchten Sie das C printf in Python überladen? – luc

+0

Bei Überladung, auf welchem ​​OS? – Arlaharen

+0

Wenn Überladung mein Problem lösen würde, würde ich versuchen. Ich benutze Ubuntu 9.10. – Framester

Antwort

0

Nun printf einfach schreibt seine Ausgabe an, was auch immer die stdout Dateizeiger verweist. Ich bin nicht sicher, wie Sie das C-Programm ausführen, aber es sollte möglich sein, die stdout des C-Programms zu etwas umzuleiten, das Sie in Python lesen können.

2

Sie könnten stdout abfangen, bevor Sie von Ihrem C Code geschrieben werden, dann verarbeiten Sie den Ausgabewert.

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__ 

Allerdings wäre es einfacher und schöner sein, einen Puffer zu dem C-Code zu übergeben, und statt printf die Ausgangswert -ing würden Sie sie in dem mitgelieferten Puffer schreiben.

Oder, noch besser, Sie byref ein c_char_p, weisen Speicher für sie innerhalb des C Code, aktualisieren Sie den Puffer mit dem Ausgangswert dann mit dem Puffer in Python passieren könnten. Vergessen Sie nicht, den Speicher freizugeben (Sie sollten einen ctypes Wrapper für die free Funktion erstellen).

+0

Das Abfangen von'Stdout' ist, was ich im Sinn hatte. Aber es funktioniert nicht für mich. Der Code ändert das Ausgabeverhalten nicht. – Framester

+0

Ich verstehe nicht wirklich, was Sie meinen * der Code ändert nicht das Ausgabeverhalten *. Eine ausführlichere Erklärung dessen, was Sie erreichen möchten, und die Probleme, denen Sie bei der 'stdout' -Umleitung begegnen, könnten uns einen Hinweis darauf geben, wie wir Ihnen helfen könnten. –

+0

Entschuldigung dafür, dass ich mich nicht klar genug ausgedrückt habe. Ich habe die Codezeilen hinzugefügt, um das 'stdout' abzufangen, aber die 'printfs' der c-Funktionen, die ich mit ctypes in Python aufrufe, werden immer noch im Terminal ausgegeben. Ich werde eine konkretere Beschreibung meines Problems in der Antwort hinzufügen. – Framester