2010-11-07 82 views
1

我使用了OpenCV的Python绑定,并使用CreateVideoWriter那里当我打电话的功能,它可将类似于下面的东西到控制台,我碰到一个小烦恼似乎无法抑制或理想地将其重定向到一个变量。从打印防止OpenCV的功能CreateVideoWriter在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 

我使用测试命令是这样的:

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

虽然从长远来看,这个应用程序将有一个控制GUI其目前基于控制台,该函数被调用每分钟所以这意味着即使是简单的菜单或更有用的状态信息也很难呈现,而这种调用不会占用控制台。

如果有人经历了同样的和/或有任何想法,我如何能够防止这种情况的发生或可以提供指针,以我在做什么错只是想知道?

+0

如果一切都失败了,你仍然可以破解它周围的sys.stdout.write'设置''到高清虚拟(_):通'然后再调用并在稍后恢复。 – delnan 2010-11-07 15:57:21

+0

我只是尝试这样做仅由调用之前设置sys.stdout的一个文件对象,然后将它设置回来之后,但它仍然要我不真正了解控制台! – Duncan 2010-11-07 16:26:57

+0

它写给'stderr'吗? – katrielalex 2010-11-07 16:28:28

回答

1

我认为最简单的方法是暂时在调用messy函数时重定向sys.stdout - 其他任何操作都会强制您更改Python绑定。

幸运的是,这是很简单:只需使用一个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

在回答你上面的问题时,不要写信给stderr,这真是令人困惑!我尝试了一个使用stdout和stderr的上下文管理器的建议,但它仍然在控制台中显示。 – Duncan 2010-11-07 16:39:56

+0

@Duncan:恩,这很奇怪。不幸的是,我不能立即想到为什么会这样。您可能需要去图书馆的源代码中查看它正在做什么。抱歉。 – katrielalex 2010-11-07 18:46:03

+0

感谢您的帮助到目前为止,Python对我来说仍然是一个学习曲线!已经开始通过OpenCV回顾,但将不得不继续明天。 – Duncan 2010-11-07 22:40:50