SageMaker监控教程boto3 upload_file传字符串仍报TypeError
报错根因
这个报错和传入upload_file()的本地路径参数"preprocessor.py"无关,错误实际触发在S3对象构造环节。
- boto3的S3 Object是懒加载对象:调用
bucket.Object()传入S3对象键(Key)时不会立刻做参数校验,直到实际调用upload_file()发起S3请求时,才会校验Key的合法性,因此报错栈指向upload_file()调用时很容易误导排查方向。 - 你当前传入的Key参数
code_prefix + "/preprocessor.py"不是合法字符串:绝大多数场景是code_prefix变量没有正确赋值,值为None;少数场景是code_prefix被赋值为Path对象、字节对象等非字符串类型,拼接后的结果不符合boto3的参数类型要求,内部做格式校验时就会抛出TypeError: expected string or bytes-like object。
修复步骤
- 先打印
code_prefix的值和类型确认问题:
print(f"code_prefix值: {code_prefix}, 类型: {type(code_prefix)}")
- 针对排查结果修复:
- 如果打印显示值为
None,回到操作步骤中code_prefix的定义位置重新赋值,按照教程逻辑,该变量应为字符串类型的S3路径前缀,类似sagemaker/model-monitor/demo。 - 如果是Path等非字符串类型,先转成字符串再拼接S3 Key:
- 如果打印显示值为
s3_object_key = f"{str(code_prefix)}/preprocessor.py" bucket.Object(s3_object_key).upload_file("preprocessor.py")
- 修复后额外确认当前代码运行的工作目录下存在
preprocessor.py本地文件,避免后续触发文件不存在的异常。
内容的提问来源于stack exchange,提问作者saman jahangiri
相关产品推荐
相关产品推荐

