You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

关键改进点

  1. 用argparse替代直接操作sys.argv,不仅能清晰定义参数,还能自动生成帮助文档(执行python script.py -h即可查看)
  2. 实现了灵活的追加逻辑,支持可选的目录和后缀追加,还做了格式校验(比如避免重复斜杠、重复后缀)
  3. 添加了异常捕获和错误提示,让脚本在出错时能给出明确信息,而不是直接崩溃

内容的提问来源于stack exchange,提问作者brandonthebuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:05:05