2010-06-28 9 views
5

Spero che sia banale e non l'ho trovato nei tutorial. Sto scrivendo il codice Python che "supervisiona" il codice c, alias io eseguo il codice c con i ctyp da python. Ora voglio "catturare" la c "printfs" per elaborare i dati che vengono emessi dal codice c. Qualche idea su come si farebbe questo?Come "catturare" c printf in python con ctypes?

Grazie

+0

Vuoi sovraccaricare il C printf in Python? – luc

+0

Se sovraccarico, su quale sistema operativo? – Arlaharen

+0

Se il sovraccarico risolvesse il mio problema, proverei. Io uso Ubuntu 9.10. – Framester

risposta

0

Bene printf scrive semplicemente la sua uscita a tutto ciò che il puntatore stdout file si riferisce a. Non sono sicuro di come si sta eseguendo il programma C, ma dovrebbe essere possibile reindirizzare il programma stdout del C a qualcosa che si può leggere in Python.

2

È possibile intercettare stdout prima di essere scritto dal codice C, quindi elaborare il valore di uscita.

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__ 

Tuttavia, sarebbe più facile e più piacevole per passare un buffer per il codice C, invece di printf ing valori di uscita che li scriverà nel buffer disponibile.

O, meglio ancora, si poteva passare byref un c_char_p, allocare memoria per all'interno del codice C, aggiornare il buffer con il valore di uscita quindi utilizzare il buffer in Python. Non dimenticare di deallocare la memoria (dovresti creare un wrapper ctypes per la funzione free).

+0

L'intercettazione di "stdout" è ciò che avevo in mente. Ma non funziona per me. Il codice non modifica il comportamento dell'output. – Framester

+0

Non capisco cosa intendi per * il codice non modifica il comportamento dell'output *. Fornire una spiegazione più dettagliata di ciò che si sta cercando di ottenere e i problemi che si incontrano con il reindirizzamento 'stdout' potrebbe darci un suggerimento su come possiamo aiutarti. –

+0

Ci scusiamo per non essermi chiarito abbastanza. Ho aggiunto le righe di codice per intercettare lo 'stdout', ma le 'printfs' delle funzioni c che chiamo con ctypes in Python sono ancora emesse nel terminale. Aggiungerò una descrizione più concreta del mio problema nella risposta. – Framester

Problemi correlati