Есть ли причина, по которой моя строка изменяется при использовании subprocess.check_output?

#python #string #amazon-web-services #subprocess

#python #строка #amazon-web-services #подпроцесс

Вопрос:

Мне нужно, чтобы строка помещалась внутри переменной, чтобы она выглядела точно так:

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

' s должны быть именно там, где они есть, когда строка будет использоваться позже.

итак, я определяю это так

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. Вы имеете в виду, что вы просто хотите сериализовать данные в JSON с помощью чего-то вроде json.dumps() ?

2. @roganjosh даже не подумал об этом. попробую

3. Вы обошли все дома и сделали все намного сложнее для себя здесь

4. @roganjosh не намеренно.

5. Очевидно, что нет 🙂

Ответ №1:

заставил его работать, выполнив следующее:

 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, поскольку эти условия были выполнены:

  • каждый ключ в объекте JSON был окружен " символом s
  • весь объект JSON в команде был окружен ' символом s

Редактировать:

здесь json.dumps() важно, потому что без этого объект отображается с ' помощью s вокруг ключей, а AWS CLI это не нравится.