2010-06-28 4 views
5

J'espère que c'est trivial et je ne l'ai pas trouvé dans les tutoriels. J'écris du code python qui "supervise" le code c, alias je cours le code c avec les ctypes de python. Maintenant, je veux "attraper" le c 'printfs' pour traiter les données qui sont produites par le code c. Une idée de comment on ferait ça?Comment 'attraper' c printf en python avec ctypes?

Merci

+0

Souhaitez-vous surcharger le C printf en Python? – luc

+0

En cas de surcharge, sur quel système d'exploitation? – Arlaharen

+0

Si la surcharge résoudrait mon problème, j'essaierais. J'utilise Ubuntu 9.10. – Framester

Répondre

0

Bien printf écrit simplement sa sortie à ce que le pointeur de fichier stdout fait référence. Je ne sais pas comment vous exécutez le programme C, mais il devrait être possible de rediriger le programme stdout du programme C vers quelque chose que vous pouvez lire en Python.

2

Vous pouvez intercepter stdout avant d'être inscrit à partir de votre code C, puis traiter la valeur de sortie.

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__ 

Cependant, il serait plus facile et plus agréable de passer un tampon au code C, et au lieu de printf -ment les valeurs de sortie que vous le feriez dans le tampon fourni.

Ou, mieux encore, vous pouvez passer un byrefc_char_p, allouer de la mémoire pour l'intérieur du code C, mettez à jour la mémoire tampon avec la valeur de sortie puis utilisez le tampon dans Python. N'oubliez pas de libérer la mémoire (vous devriez créer un wrapper ctypes pour la fonction free).

+0

L'interception de 'stdout' est ce que j'avais en tête. Mais ça ne marche pas pour moi. Le code ne modifie pas le comportement de sortie. – Framester

+0

Je ne comprends pas vraiment ce que vous entendez par * le code ne change pas le comportement de sortie *. Fournir une explication plus détaillée de ce que vous essayez d'atteindre et les problèmes que vous rencontrez avec la redirection 'stdout' pourrait nous donner un indice sur la façon dont nous pourrions vous aider. –

+0

Désolé de ne pas m'avoir rendu assez clair. J'ai ajouté les lignes de code pour intercepter le 'stdout', mais le 'printfs' des fonctions c que j'appelle avec ctypes en Python est toujours sorti dans le terminal. Je vais ajouter une description plus concrète de mon problème dans la réponse. – Framester

Questions connexes