在Python中将屏幕输出发送到/ dev / null

问题描述 投票:0回答:2

我从python中的函数返回一个变量。

当我尝试在另一个函数中检索变量时,它会再次打印出原始函数的print语句。

这是我的代码:

user_name = 'my_user'
kms_cleint = 'client_info'
aws_account = 'company-account'
def create_kms_key(user_name, kms_client):   
    print("****************************************************************")
    print("         Create KMS Key for %s                                   " % user_name)
    print("****************************************************************")
    kms_key_id = 5
    return kms_key_id

def store_secret(user_name, kms_client, secrets_client, aws_account):
    print("****************************************************************")
    print("         Store Secret for %s for AWS account: %s                " % (user_name, aws_account))
    print("****************************************************************")
    f = open(os.devnull,"w")
    kms_key_id = create_kms_key(user_name, kms_client).set_log_stream(f)

我的输出:

****************************************************************
         Create KMS Key for user35
****************************************************************
****************************************************************
         Store Secret for user35 for AWS account: company-account
****************************************************************
****************************************************************
         Create KMS Key for user35
****************************************************************

我试图避免第二次打印出create_kms_key函数输出。

当我在调用create_kms_key函数时尝试将输出重定向到/ dev / null时,我收到此错误:

AttributeError: 'int' object has no attribute 'set_log_stream'

如何让create_kms_key函数不再打印第二次输出?

python
2个回答
1
投票

该错误与此行有关:

create_kms_key(user_name, kms_client).set_log_stream(f)

函数create_kms_key返回一个int,然后你立即调用.set_log_stream(f),这不是int的方法。不仅如此,create_kms_key.set_log_stream(f)被调用之前完全运行。

而不是这些线:

f = open(os.devnull,"w")
kms_key_id = create_kms_key(user_name, kms_client).set_log_stream(f)

试试这些:

with open(os.devnull, 'w') as devnull:
    saved_stdout = sys.stdout  # save off the real stdout
    sys.stdout = devnull       # temporarily suppress stdout
    kms_key_id = create_kms_key(user_name, kms_client)
    sys.stdout = saved_stdout  # restore stdout

这样你就可以暂时禁止通常写入sys.stdout的文本。你必须要小心create_kms_key中抛出的任何异常,因为它们可以跳过恢复代码行,防止sys.stdout被正确恢复。


0
投票

我通过这样做解决了这个问题:

import contextlib
    with contextlib.redirect_stdout(None):
        kms_key_id = create_kms_key(user_name, kms_client)

这会阻止功能再次打印出来。

© www.soinside.com 2019 - 2024. All rights reserved.