2010-11-07 7 views
1

J'utilise les bindings Python pour OpenCV et j'ai rencontré un petit problème en utilisant CreateVideoWriter où quand j'appelle la fonction, il imprime quelque chose de similaire à la ci-dessous à la console et je ne peut pas sembler le surpresser ou idéalement le rediriger dans une variable.Empêcher la fonction OpenCV CreateVideoWriter d'imprimer sur console en Python

Output #0, avi, to 'temp/Temp.0433.avi': 
    Stream #0.0: Video: mjpeg, yuvj420p, 320x240, q=2-31, 9830 kb/s, 90k tbn, 25 
tbc 

La commande J'utilise pour le test est la suivante:

self.file = cvCreateVideoWriter(nf,CV_FOURCC('M','J','P','G'),self.fps,cvSize(320,240),1) 

Bien à long terme, cette application aura une interface de contrôle de sa console actuellement en fonction, la fonction est appelée à chaque minute pour ce signifie qu'il est difficile de présenter même un menu simple ou des informations d'état plus utiles sans que cet appel ne remplisse la console. Je me demandais simplement si quelqu'un a expérimenté la même chose et/ou a des idées sur la façon dont je pourrais empêcher que cela se produise ou puisse offrir des conseils sur ce que je fais de mal?

+0

Si tout le reste échoue, vous pouvez toujours pirater autour d'elle en mettant '' sys.stdout.write' de mannequin def (_): passe 'avant de l'appeler et de le restaurer plus tard. – delnan

+0

J'ai juste essayé ceci en plaçant sys.stdout à un objet de fichier juste avant l'appel et en le remettant en place par la suite mais il va toujours à la console que je ne comprends pas vraiment! – Duncan

+0

Est-ce qu'il écrit dans 'stderr'? – katrielalex

Répondre

1

Je pense que la façon la plus simple pour vous de faire ceci est temporairement de rediriger sys.stdout tout en appelant la fonction désordonnée - tout autre chose vous forcera à changer les liaisons Python.

Heureusement, cela est facile: il suffit d'utiliser un contextmanager:

>>> import contextlib 
>>> @contextlib.contextmanager 
... def stdout_as(stream): 
...  import sys 
...  sys.stdout = stream 
...  yield 
...  sys.stdout = sys.__stdout__ 
... 
>>> print("hi") 
hi 
>>> import io 
>>> stream = io.StringIO() 
>>> with stdout_as(stream): 
...  print("hi") 
... 
>>> stream.seek(0) 
0 
>>> stream.read() 
'hi\n' 
>>> print("hi") 
hi 
+0

En réponse à votre question ci-dessus, non, il n'est pas écrit à stderr soit ce qui est vraiment déroutant! J'ai essayé votre suggestion d'un gestionnaire de contexte avec stdout et stderr mais c'est toujours affiché dans la console. – Duncan

+0

@Duncan: hmm, c'est bizarre. Malheureusement je ne peux pas immédiatement penser à aucune raison pour laquelle cela pourrait être. Vous devrez peut-être aller vous promener dans le code source de la bibliothèque pour voir ce qu'il fait. Pardon. – katrielalex

+0

Merci pour votre aide jusqu'à présent tout de même, Python est encore vraiment une courbe d'apprentissage pour moi! Nous avons commencé à regarder en arrière à travers OpenCV mais nous devrons continuer demain. – Duncan

Questions connexes