使用subprocess.check_output时,我的字符串发生变化是有原因的吗?

时间:2019-04-12 15:29:16

标签: python string amazon-web-services subprocess

我需要将字符串放置在变量中,以使准确像这样:

'{"S3Object":{"Bucket":"<bucketname>","Name":"<docname>","Version":"<version>"}}'

'必须与以后使用字符串时的位置完全相同。

所以,我这样定义

aws_object = """'{"S3Object":{"Bucket":"%s","Name":"%s","Version":"1"}}'""" % (AWS_BUCKET, AWS_DOCUMENT_NAME)

这是我发现的唯一方法,该方法将允许将变量放置在字符串中,同时可以根据需要使用'"。将变量打印到控制台会导致字符串看起来很完美。

但是,稍后使用aws_object会导致字符串看起来像

\'{"S3Object":{"Bucket":"testing-bucket","Name":"contract.pdf","Version":"1"}}\'']'

在控制台中,当在subprocess.check_output中使用时,如下所示:

job_id = subprocess.check_output(["aws textract start-document-text-detection --document '{}'".format(aws_object)], shell=True)

因此其中还有一些额外的字符,可能是通过在"""中使用aws_object来实现的。

返回的错误提示Unable to get object metadata from S3.,因为传递给start-document-text-detection的对象的格式不正确。

如何实现所需的字符串格式以使AWS CLI满意?

1 个答案:

答案 0 :(得分:0)

通过执行以下操作使其起作用:

aws_object = {"S3Object":{"Bucket":AWS_BUCKET,"Name":AWS_DOCUMENT_NAME,"Version":"1"}}
aws_object = json.dumps(aws_object)
...
try:
  job_id = subprocess.check_output(["aws textract start-document-text-detection --document '{}'".format(aws_object)], shell=True)
except subprocess.CalledProcessError as e:
  print(e)

由于满足以下条件,这使AWS CLI感到高兴:

  • JSON对象中的每个键都被"包围
  • 命令中的整个JSON对象被'包围

编辑:

json.dumps()在这里很重要,因为没有它,对象将在键周围使用'来呈现,而AWS CLI则不喜欢。