当 AWS-CLI 在 Python 中作为子进程运行时未指定 AWS 同步参数

Ale*_*gur 2 python subprocess amazon-s3 aws-cli

我有一个 AWS S3 存储桶,其中填充了按日期参数化的数据。我想使用 AWS CLI(参考)(特别是命令)一次提取一个日期的数据aws s3 sync

以下命令执行我期望的操作:

aws s3 sync s3://my-bucket-1 . --exclude "*" --include "*2018-01-17*" --dryrun

从命令行运行此命令会(dryrun) download为存储桶中包含子字符串的每个文件生成一个2018-01-17.

伟大的!为了简化必要的文件操作,我围绕这个执行器编写了一个小型 CLI 包装器。该包装器采用 Python 编写,并使用该subprocess.run工具来完成其工作。整个操作归结为以下调用:

subprocess.run(['aws', 's3', 'sync', 's3://my-bucket-1', '.', '--exclude', '"*"', '--include', '"*2018-01-17*"', '--dryrun'])
Run Code Online (Sandbox Code Playgroud)

问题是,当我运行此语句时,我会返回(dryrun) download存储桶中的每个文件。也就是说,返回与 01-18、01-19 等存储桶条目相对应的数据。--exclude/规则--include无法应用,结果与我简单运行的结果相同aws s3 sync s3://my-bucket-1 .

为什么会出现这种情况?

syt*_*ech 6

使用列表形式的调用时,不应使用这些额外的双引号。通常,当您的命令作为单个字符串给出时,引号可以识别双引号之间的内容是单个参数的全部部分。

如果您在列表项中使用双引号,则应该将其解析为按字面意思传递引号作为参数,因此它会转义您的引号并按字面传递它。因此,没有任何内容与您的includeexclude参数匹配,因为参数包含文字"

因此,以下应该是更正的论点。

subprocess.run(['aws', 's3', 'sync', 's3://my-bucket-1', '.', '--exclude', '*', '--include', '*2018-01-17*', '--dryrun'])
Run Code Online (Sandbox Code Playgroud)