Использование аргументов python argparse в качестве значений переменных в файле json - PullRequest
0 голосов
/ 30 декабря 2018

Я немного погуглил и не могу найти полезной информации.По сути, мне нужно взять пользовательский ввод из моих аргументов argparse из скрипта python (как показано ниже) и вставить эти значения в файл json (packerfile.json), расположенный в том же рабочем каталоге.Я экспериментировал с библиотеками subprocess, invoke и plumbum, но не смог "найти подходящую туфлю".

Из следующего кода я удалил все, кроме аргументов дляclean up:

#!/usr/bin/python
import os, sys, subprocess
import argparse
import json
from invoke import run
import packer

parser = argparse.ArgumentParser()
parser._positionals.title = 'Positional arguments'
parser._optionals.title = 'Optional arguments'
parser.add_argument("--access_key",
                     required=False,
                     action='store',
                     default=os.environ['AWS_ACCESS_KEY_ID'],
                     help="AWS access key id")
parser.add_argument("--secret_key",
                     required=False,
                     action='store',
                     default=os.environ['AWS_SECRET_ACCESS_KEY'],
                     help="AWS secret access key")
parser.add_argument("--region",
                     required=False,
                     action='store',
                     help="AWS region")
parser.add_argument("--guest_os_type",
                     required=True,
                     action='store',
                     help="Operating system to install on guest machine")
parser.add_argument("--ami_id",
                     required=False,
                     help="AMI ID for image base")
parser.add_argument("--instance_type",
                     required=False,
                     action='store',
                     help="Type of instance determines overall performance (e.g. t2.medium)")
parser.add_argument("--ssh_key_path",
                     required=False,
                     action='store',
                     default=os.environ['HOME']+'/.ssh',
                     help="SSH key path (e.g. ~/.ssh)")
parser.add_argument("--ssh_key_name",
                     required=True,
                     action='store',
                     help="SSH key name (e.g. mykey)")
args = parser.parse_args()
print(vars(args))

json пример кода:

{
  "variables": {
    "aws_access_key": "{{ env `AWS_ACCESS_KEY_ID` }}",
    "aws_secret_key": "{{ env `AWS_SECRET_ACCESS_KEY` }}",
    "magic_reference_date": "{{ isotime \"2006-01-02\" }}",
    "aws_region": "{{ env 'AWS_REGION' }}",
    "aws_ami_id": "ami-036affea69a1101c9",
    "aws_instance_type": "t2.medium",
    "image_version" : "0.1.0",
    "guest_os_type": "centos7",
    "home": "{{ env `HOME` }}"
  },

, поэтому пользовательский ввод для --region, как показано в скрипте python, будет подключен к значению для aws_region в файле json.

Я знаю, как напечатать значение аргументов.Полная команда, которую я предоставляю сценарию: python packager.py --region us-west-2 --guest_os_type rhel7 --ssh_key_name test_key, и напечатанные результаты {'access_key': 'REDACTED', 'secret_key': 'REDACTED', 'region': 'us-west-2', 'guest_os_type': 'rhel7', 'ami_id': None, 'instance_type': None, 'ssh_key_path': '/Users/REDACTEDt/.ssh', 'ssh_key_name': 'test_key'} .. мне нужно импортировать эти значения в список переменных packerfile.json, желательно таким образом, чтобы я мог использовать его повторно.это (так что он не должен перезаписывать файл)

Примечание: я также экспериментировал с использованием python для экспорта переменных локальной среды, а затем с помощью файла JSON, но это не похоже нажизнеспособное решение.

Я думаю, что наилучшим решением может быть принятие всех этих аргументов и их экспорт в собственный файл JSON с именем variables.json и импорт этих переменных из JSON (variables.json) в JSON (packerfile)..json) как отдельный процесс.Тем не менее, здесь можно использовать руководство:)

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Я действительно смог придумать довольно простое решение.

    args = parser.parse_args()
    print(json.dumps(vars(args), indent=4))
    s.call("echo '%s' > variables.json && packer build -var-file=variables.json packerfile.json" % json_formatted, shell=True)

аргументы записываются в переменную args и выводятся на выход с помощью json.dump, пока vars проверяеттакже вывести аргументы с их значениями ключа, и в настоящее время я должен запустить свой код с >> vars.json, но я вставлю логику, чтобы Python обрабатывал это.

Примечание: s == подпроцесс в s.call

0 голосов
/ 30 декабря 2018

Вы можете использовать атрибут __dict__ из SimpleNamespace, который возвращается ArgumentParser.Например:

import json
parsed = parser.parse_args()
with open('packerfile.json', 'w') as f:
  json.dump(f, parsed.__dict__)

При необходимости вы можете использовать add_argument(dest='attrib_name') для настройки имен атрибутов.

...