使用argparse向Boto3 Python脚本传递Shell参数并追加内容
解决Python脚本接收Shell参数并支持追加操作的问题
首先得指出你当前脚本里的几个明显问题:
s3.Bucket('my-bucket').upload_file()的参数完全错误——你把print语句塞进去了,这会导致传递None值给方法,而upload_file需要的是本地文件路径字符串和S3对象键字符串。- 直接用
sys.argv虽然能取参数,但要实现灵活的追加操作(比如加文件类型、目录),用argparse会更规范、易扩展。
下面是修改后的完整脚本,兼顾参数接收、追加操作和错误处理:
#!/usr/bin/python import sys import argparse import boto3 def main(): # 配置argparse参数解析器 parser = argparse.ArgumentParser(description='上传文件到S3,支持追加目录/文件后缀') # 必选参数:本地文件路径、S3基础对象键 parser.add_argument('local_file', help='要上传的本地文件路径') parser.add_argument('s3_base_key', help='S3对象的基础键名(可追加目录/后缀)') # 可选参数:追加目录、追加文件后缀 parser.add_argument('--append-dir', help='要追加到S3键的目录(例如:"docs/")') parser.add_argument('--append-suffix', help='要追加到S3键的文件后缀(例如:".txt")') # 解析命令行参数 args = parser.parse_args() # 处理S3对象键的追加逻辑 s3_key = args.s3_base_key # 追加目录(确保目录格式正确,避免重复斜杠) if args.append_dir: s3_key = f"{args.append_dir.rstrip('/')}/{s3_key}" # 追加后缀(避免重复添加相同后缀) if args.append_suffix: if not s3_key.endswith(args.append_suffix): s3_key += args.append_suffix # 初始化S3资源并执行上传 try: s3 = boto3.resource('s3') bucket = s3.Bucket('my-bucket') bucket.upload_file(args.local_file, s3_key) print(f"文件上传成功:s3://my-bucket/{s3_key}") except Exception as e: print(f"上传失败:{str(e)}", file=sys.stderr) sys.exit(1) if __name__ == '__main__': main()
使用示例
根据你的需求,不同场景下的调用方式如下:
基础用法(直接传参数,无追加):
python script.py ./test.txt my-test-file这会把本地
test.txt上传到s3://my-bucket/my-test-file追加目录:
python script.py ./data.csv raw-data --append-dir datasets/最终上传路径为
s3://my-bucket/datasets/raw-data追加文件后缀:
python script.py ./image img --append-suffix .png最终上传路径为
s3://my-bucket/img.png同时追加目录和后缀:
python script.py ./app-log log --append-dir logs/ --append-suffix .log最终上传路径为
s3://my-bucket/logs/log.log
关键改进点
- 用
argparse替代直接操作sys.argv,不仅能清晰定义参数,还能自动生成帮助文档(执行python script.py -h即可查看) - 实现了灵活的追加逻辑,支持可选的目录和后缀追加,还做了格式校验(比如避免重复斜杠、重复后缀)
- 添加了异常捕获和错误提示,让脚本在出错时能给出明确信息,而不是直接崩溃
内容的提问来源于stack exchange,提问作者brandonthebuck
相关产品推荐
相关产品推荐

