我一直在使用包含变量的文件作为程序的输入,然后在运行时将其导入主程序。我正在将此系统移动到使用argparse读取文件中的输入值。当前输入变量之一是字典列表,每个字典提供给定计算的设置。
CalculationVals=[{'startx':0,'starty':0,'endx':10, 'endy':10}, {'startx':1,'starty':1,'endx':12, 'endy':12}]
然后在程序的主要部分中,循环各个CalculationVals。有没有办法使用argparse读取它,或者使用argparse方法提供此输入的更好方法?这里不依赖额外的包装是有利的。
答案 0 :(得分:1)
这不是argparse的用途。它用于解析命令行参数,而不是配置文件。
看起来你的配置是JSON,除非你做了一些非常奇怪的事情并严重滥用库,argparse不知道如何解析JSON。因此,无论如何要了解import json
所需的参数。在这一点上,最简单(也是最有效)的事情就是
import json
with open('/your/config/file', 'r') as f:
config = json.loads(f.read())
答案 1 :(得分:0)
正如德米特里建议的那样,将json作为函数的参数传递不是推荐的方法。
所以,我建议你在参数中传递json文件路径而不是整个json文件。
# test_prog.py
import argparse
import json
parser = argparse.ArgumentParser()
parser.add_argument("-f","--filepath", help="json file path")
args = parser.parse_args()
with open(args.filepath, 'r') as f:
config = json.load(f)
print config
然后使用此值来使用json lib进行读取。
如果json文件也是远程的,你可以传递url作为参数!
示例运行:
$ python test_prog.py -f ./f1.json
[{u'endy': 10, u'endx': 10, u'startx': 0, u'starty': 0}, {u'endy': 12, u'endx': 12, u'startx': 1, u'starty': 1}]
文件内容,f1.json:
[{"startx":0,"starty":0,"endx":10, "endy":10},{"startx":1,"starty":1,"endx":12, "endy":12}]
答案 2 :(得分:0)
第一个选项是直接传入参数,并为每组值调用一次脚本。目前还不清楚这是否符合您的使用案例。
./your_script.py startx=0, starty=0, endx=10, endy=10
或者,您可以使用易于解析的文件格式(如JSON或CFG),而不是直接导入python文件。
JSON文件:
{
"CalculationVals": [{
"startx": 0,
"starty": 0,
"endx": 10,
"endy": 10
}, {
"startx": 1,
"starty": 1,
"endx": 12,
"endy": 12
}]
}
的Python:
import argparse
import json
parser = argparse.ArgumentParser()
parser.add_argument('file')
args = parser.parse_args()
with open(args.file) as fi:
configs = json.load(fi)
for values in configs['CalculationVals']:
startx = values['startx']
starty = values['starty']
调用脚本: ./your_script.py config.json