[英]Prevent OpenCV function CreateVideoWriter from printing to console in Python
[英]To prevent a function from printing in the batch console in Python
好吧,標題在我看來就足夠了。 我使用一些函數在某些時候在控制台中打印一些東西。 由於我無法修改它們,我想知道是否有解決方案可以在使用這些功能時不打印。
非常感謝 !
妮可
是的,您可以重定向sys.stdout
:
import sys
import os
old_stdout = sys.stdout # backup current stdout
sys.stdout = open(os.devnull, "w")
my_nasty_function()
sys.stdout = old_stdout # reset old stdout
只需將my_nasty_function
替換為您的實際功能即可。
編輯:現在也應該在 Windows 上工作。
編輯:當有人再次包裝您的函數時,使用備份變量重置標准輸出會更好
Constantinius 的回答是可以的,但是沒有必要實際打開 null 設備。 順便說一句,如果你想要便攜式空設備,有os.devnull
。
實際上,您所需要的只是一個類,它會忽略您寫入的任何內容。 所以更便攜的版本是:
class NullIO(StringIO):
def write(self, txt):
pass
sys.stdout = NullIO()
my_nasty_function()
sys.stdout = sys.__stdout__
.
另一種選擇是將您的函數包裝在裝飾器中。
from contextlib import redirect_stdout
from io import StringIO
class NullIO(StringIO):
def write(self, txt):
pass
def silent(fn):
"""Decorator to silence functions."""
def silent_fn(*args, **kwargs):
with redirect_stdout(NullIO()):
return fn(*args, **kwargs)
return silent_fn
def nasty():
"""Useful function with nasty prints."""
print('a lot of annoying output')
return 42
# Wrap in decorator to prevent printing.
silent_nasty = silent(nasty)
# Same output, but prints only once.
print(nasty(), silent_nasty())
您可以使用此答案的修改版本來創建“空”輸出上下文來包裝函數調用。
這可以通過在使用時將os.devnull
作為new_stdout
參數傳遞給stdout_redirected()
上下文管理器函數來完成。
Constantinius目前接受的答案在大多數情況下都很好用,但在 Jupyter 筆記本中則不然。 這是讓它工作的方法(具有可重用的功能)......
TLDR~不要使用sys.__stout__
,備份sys.stdout
並在以后恢復它。
在 Jupyter 筆記本中,運行sys.stdout == sys.__stdout__
返回 false。 這是因為每個單元格都有一個單獨的輸出流(而不是一個終端實例,即sys.__stdout__
)。 因此,對於使用 Jupyter Notebook 的每個人,請確保備份舊的sys.stdout
路徑並在之后恢復它。 這是它的一個函數:
import sys, os
def deafen(function, *args):
real_stdout = sys.stdout
sys.stdout = open(os.devnull, "w")
output = function(*args)
sys.stdout = real_stdout
return output
傳遞給函數及其參數/參數 ( args
) 使其deafen
。 它備份舊的sys.stdout
,切換到os.devnull
並返回自身。
對於一個完整的例子,我們可以創建第二個函數( test_function
):
def test_function(first_argument, second_argument, *args):
print(first_argument)
print(second_argument)
print(args)
現在,如果我們test_function
嘗試使用test_function
(也就是沒有deafen
),我們將在屏幕上打印出一堆輸出:
print("Printing should work fine here")
test_function(32, 12, 1, 32, 1)
但是,當使用deafen
,我們不會得到新的輸出:
print("That'll be the last thing you see...")
deafen(test_function, 32, 12, 1, 32, 1)
附帶說明一下, deafen
函數仍然返回函數輸出。 您也可以使用deafen
用sys.__stdout__
通過替換sys.stdout = real_stdout
與sys.stdout = sys.__stdout__
(可能還有去除real_stdout = sys.stdout
,而你在它)。
希望能幫助任何正在尋找更強大或更靈活的解決方案(可能用於 Jupyter 筆記本,或與多種功能一起使用)的人!
Constantinius 的解決方案適用於 *nix,但這應該適用於任何平台:
import sys
import tempfile
sys.stdout = tempfile.TemporaryFile()
# Do crazy stuff here
sys.stdout.close()
#now the temp file is gone
sys.stdout = sys.__stdout__
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.