我从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函数不再打印第二次输出?
该错误与此行有关:
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
被正确恢复。
我通过这样做解决了这个问题:
import contextlib
with contextlib.redirect_stdout(None):
kms_key_id = create_kms_key(user_name, kms_client)
这会阻止功能再次打印出来。