我正在从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函数第二次打印输出?
答案 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)
这将阻止该功能第二次打印。