【问题标题】:Send screen output to /dev/null in Python在 Python 中将屏幕输出发送到 /dev/null
【发布时间】:2019-04-03 16:03:20
【问题描述】:

我从 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 函数再次打印它的输出?

【问题讨论】:

  • 看起来这可能已在其他地方得到回答:stackoverflow.com/questions/6735917/…
  • 谢谢。我从那个确切的堆栈溢出链接尝试接受的解决方案,但没有奏效。那是在上面的代码中。但是我确实在同一个线程中找到了另一个解决方案。那使用上下文库。我使用 ` 与 contextlib.redirect_stdout(None): kms_key_id = create_kms_key(user_name, kms_client)` 有效。谢谢!
  • 我的错,没有仔细阅读您的问题......对不起!
  • 哈哈!没关系,伙计。不管怎么说,还是要谢谢你。 :)

标签: python


【解决方案1】:

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

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

这会阻止该函数再次打印出来。

【讨论】:

    【解决方案2】:

    错误与这一行有关:

    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 正确恢复。

    【讨论】:

    • 这看起来是个不错的解决方案!我会尝试一下。正如我上面提到的,我已经用 contextlib 解决了这个问题。但最好有这个选项。谢谢!
    • 啊,很好!老实说,您找到的contextlib 解决方案可能会处理我所说的异常问题,因此它可能是更安全的解决方案。 (它也有点短。)
    • 是的!这就是我喜欢它的地方。它无害,简洁,效果很好!什么是不爱的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多