使用python argparse参数作为json文件中的变量值

问题描述 投票:0回答:2

我已经搜索了相当多的内容,我无法找到有用的见解。基本上,我需要从python脚本中获取来自argparse参数的用户输入(如下所示),并将这些值插入位于同一工作目录中的json文件(packerfile.json)。我一直在试验subprocessinvokeplumbum图书馆而不能“找到合适的鞋子”。

从以下代码中,我删除了除清理之外的所有参数:

#!/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` }}"
  },

因此,如python脚本中所示的--region的用户输入应插入json文件中aws_region的值。

我知道如何打印args的值。我提供给脚本的完整命令是: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'} ..我需要的是将thos值导入packerfile.json变量列表..最好以我可以重用它的方式(所以它musn' t覆盖文件)

注意:我也一直在尝试使用python导出本地环境变量,然后让JSON文件选择它们,但这似乎不是一个可行的解决方案。

我认为最好的解决方案可能是获取所有这些参数并将它们导出到自己的名为variables.json的JSON文件中,并将这些变量从JSON(variables.json)导入JSON(packerfile.json)作为单独的进程。虽然这里仍然可以使用指导:)

json python-3.x argparse
2个回答
0
投票

您可以使用__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')自定义属性名称。


0
投票

我实际上能够提出一个非常简单的解决方案。

    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中的子进程

© www.soinside.com 2019 - 2024. All rights reserved.