使用Python将屏幕输出发送到/ dev / null

时间:2019-04-03 16:03:20

标签: python

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

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

这是我的代码:

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函数第二次打印输出?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我通过以下方法解决了这个问题:

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

这将阻止该功能第二次打印。