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

在Python中将屏幕输出发送到/dev/null,python,Python,我从python中的函数返回一个变量 当我试图在另一个函数中检索变量时,它会再次打印出原始函数的print语句 这是我的密码: user_name = 'my_user' kms_cleint = 'client_info' aws_account = 'company-account' def create_kms_key(user_name, kms_client): print("************************************************

我从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_键函数输出

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

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

如何防止create_kms_key函数再次打印其输出?

错误与此行有关:

create_kms_key(user_name, kms_client).set_log_stream(f)
函数
create\u kms\u key
返回一个
int
,然后立即调用
。set\u log\u stream(f)
,这不是
int
的方法。不仅如此,
create\u kms\u key
在调用
之前完全运行。set\u log\u 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\u kms\u key
中抛出的任何异常,因为它们可能会跳过代码的还原行,从而阻止
sys.stdout
正确还原。

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

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

这将防止该函数再次打印。

看起来这可能在其他地方得到了回答:谢谢。我尝试了从堆栈溢出链接接受的解决方案,但没有成功。这在上面的代码中。然而,我确实在同一个线程中找到了另一个解决方案。使用contextlib的。我使用了'with contextlib.redirect\u stdout(None):kms\u key\u id=create\u kms\u key(user\u name,kms\u client)`这很有效。谢谢我的错,没有仔细阅读你的问题。。。很抱歉哈哈!没关系,伙计。无论如何,谢谢。:)这看起来是个不错的解决方案!我会试试看。正如我上面提到的,我已经用contextlib解决了这个问题。但有这样的选择是很好的。谢谢啊,很好!老实说,您找到的
contextlib
解决方案可能会处理我刚才提到的异常问题,因此它可能是更安全的解决方案。(它也短了一点。)是的!这就是我喜欢它的原因。它是无害的,简洁的,效果很好!什么是不爱?