【发布时间】:2019-05-27 03:56:56
【问题描述】:
我已经用谷歌搜索了很多,但无法找到有用的见解。基本上,我需要从 python 脚本中的 argparse 参数中获取用户输入(如下所示),并将这些值插入位于同一工作目录中的 json 文件(packerfile.json)中。我一直在尝试使用 subprocess、invoke 和 plumbum 库,但无法“找到合适的鞋子”。
从下面的代码中,我删除了除了清理参数之外的所有内容:
#!/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'} .. 我需要将这些值导入packerfile.json 变量列表.. 最好以我可以重用的方式它(所以它不能覆盖文件)
注意:我也一直在尝试使用 python 导出本地环境变量,然后让 JSON 文件提取它们,但这似乎不是一个可行的解决方案。
我认为最好的解决方案可能是获取所有这些参数并将它们导出到它自己的名为 variables.json 的 JSON 文件中,然后将这些变量从 JSON (variables.json) 导入到 JSON (packerfile.json) 作为单独的过程。不过这里仍然可以使用指导:)
【问题讨论】:
-
在
parse_args(),print(args)之后查看解析器产生了什么。print(vars(args))将显示与字典相同的内容。args,region将是解析为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'}.. 我需要将这些值导入packerfile.json变量列表.. 最好以我可以重用的方式它(所以它不能覆盖文件) -
这确实是
packer问题,而不是argparse问题。parser使您可以在 Python 脚本中访问一组变量(或称它们为属性)。您可以在 JSON 兼容字典中收集这些值,并使用标准json模块将其转储为字符串或文件。但我不知道这对packer是否有帮助。 -
你觉得只是把 packer 当作我只是在处理 json ......这就是我想要做的......现在我知道 packer 让我有能力拥有我的变量位于不同的 json 文件中......所以我想用 py 脚本在当前工作目录中生成一个 json 文件并将其用作 bar.json 文件。
-
如果您想知道我的用例...我正在努力做到这一点,以便我可以拥有一个脚本,将任何值应用于打包程序变量,最终应用于我们所有的打包程序图像将通过单个打包器 json 文件提供支持...因此我们只需要版本化单个 json 文件而不是几十个。
标签: json python-3.x argparse