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

在Python中将AWS-CLI作为子进程运行时,未指定AWS同步参数,python,amazon-s3,subprocess,aws-cli,Python,Amazon S3,Subprocess,Aws Cli,我有一个AWS S3存储桶,里面装满了按日期参数化的数据。我希望使用AWS CLI,特别是AWS s3 sync命令,一次提取一个日期的数据 以下命令执行我希望它执行的操作: aws s3同步s3://my-bucket-1-不包括*-包括*2018-01-17*-干运行 从我的命令行运行此命令会为我的bucket中包含子字符串2018-01-17的每个文件生成一个dryrun下载 太好了!为了简化必要的文件操作,我围绕这个执行器编写了一个小型CLI包装器。这个包装器是用Python编写的,并使

我有一个AWS S3存储桶,里面装满了按日期参数化的数据。我希望使用AWS CLI,特别是AWS s3 sync命令,一次提取一个日期的数据

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

aws s3同步s3://my-bucket-1-不包括*-包括*2018-01-17*-干运行

从我的命令行运行此命令会为我的bucket中包含子字符串2018-01-17的每个文件生成一个dryrun下载

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

subprocess.run(['aws', 's3', 'sync', 's3://my-bucket-1', '.', '--exclude', '"*"', '--include', '"*2018-01-17*"', '--dryrun'])
问题是,当我运行这个语句时,我得到了bucket中每个文件的dryrun下载。也就是说,返回与01-18、01-19等中的bucket条目相对应的数据。-exclude/-include规则无法应用,结果与我只运行aws s3 sync s3://my-bucket-1的结果相同


为什么会出现这种情况?

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

如果在列表项中使用类似的双引号,那么应该将其解析为将引号作为参数逐字传递,因此它将转义引号并逐字传递。因此,没有任何内容与include和exclude参数匹配,因为该参数包含文字

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

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

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

如果在列表项中使用类似的双引号,那么应该将其解析为将引号作为参数逐字传递,因此它将转义引号并逐字传递。因此,没有任何内容与include和exclude参数匹配,因为该参数包含文字

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

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

我认为在使用列表时,没有必要引用你的论点。IE“*2018-01-17*”或许应该是“*2018-01-17*”。请参阅哪个描述了在列表中使用不带引号的参数的解决方案,否则在命令的字符串版本中会使用引号。快速测试将确认这是正确答案。我很困惑为什么。这是一个设计决定。我想这个想法是Python将为您做正确的事情。假设您将变量传递到命令中,这些命令可能需要引号,也可能不需要引号。在字符串版本中,引号有助于确定双引号中包含的字符串是同一参数的一部分。当您在列表中传递参数时,已经很清楚什么是什么。。。所以我们假设,如果你在命令的一部分有一个a,它将被逐字解释。希望这是有意义的。我认为当使用列表时,没有必要引用你的论点。IE“*2018-01-17*”或许应该是“*2018-01-17*”。请参阅哪个描述了在列表中使用不带引号的参数的解决方案,否则在命令的字符串版本中会使用引号。快速测试将确认这是正确答案。我很困惑为什么。这是一个设计决定。我想这个想法是Python将为您做正确的事情。假设您将变量传递到命令中,这些命令可能需要引号,也可能不需要引号。在字符串版本中,引号有助于确定双引号中包含的字符串是同一参数的一部分。当您在列表中传递参数时,已经很清楚什么是什么。。。所以我们假设,如果你在命令的一部分有一个a,它将被逐字解释。希望这是有道理的。