Python跨脚本调用类方法返回None的问题排查与解决方案
问题原因
- 最核心的问题是你定义的
getUserName()方法只直接返回初始化时设置为None的self.username,全程没有调用负责给self.username赋值的get_secret()方法,自然拿不到预期的凭证值。 - 除此之外原始代码还有两处基础问题:
get_secret()方法下的所有代码缩进错误,Python会报语法错误无法运行secret_name为空字符串、region_name变量未定义,调用AWS Secrets Manager接口会直接报错
修正方案
你给出的修正代码方向是对的,补全get_secret()的完整逻辑、修正缩进、补全缺失参数即可,完整可运行的参考代码如下:
脚本A(Script_A.py)
import boto3 import json class A: def __init__(self): self.username = None self.password = None def getUserName(self): # 先调用拉取凭证的方法给self.username赋值,再返回 self.get_secret() return self.username def get_secret(self): # 补全你的secret名称和对应区域 secret_name = "你的凭证在Secrets Manager里的ID" region_name = "你的AWS区域,比如cn-north-1" session = boto3.session.Session() client = session.client( service_name='secretsmanager', region_name=region_name ) get_secret_value_response = client.get_secret_value( SecretId=secret_name ) if 'SecretString' in get_secret_value_response: secret = get_secret_value_response['SecretString'] creds = json.loads(secret) self.username = creds['username'] else: # 补全二进制凭证处理逻辑 pass
脚本B调用逻辑不变
from Script_A import A credentials = A() username = credentials.getUserName() print(username)
优化建议
- 如果需要频繁调用
getUserName(),可以增加判断避免重复拉取凭证:只有self.username为None时才调用get_secret() - 建议给
get_secret()增加异常捕获逻辑,处理AWS接口调用失败、凭证解析失败等异常场景
内容的提问来源于stack exchange,提问作者PattheChosen
相关产品推荐
相关产品推荐

