簡體   English   中英

防止函數在 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函數仍然返回函數輸出。 您也可以使用deafensys.__stdout__通過替換sys.stdout = real_stdoutsys.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM