在Python中将屏幕输出发送到/dev/null
我从python中的函数返回一个变量 当我试图在另一个函数中检索变量时,它会再次打印出原始函数的print语句 这是我的密码:在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("************************************************
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
解决方案可能会处理我刚才提到的异常问题,因此它可能是更安全的解决方案。(它也短了一点。)是的!这就是我喜欢它的原因。它是无害的,简洁的,效果很好!什么是不爱?