当列表来自json文件时,如何在Python中将整个列表作为命令行参数传递
根据中的一个答案,可以使用当列表来自json文件时,如何在Python中将整个列表作为命令行参数传递,python,json,command-line-arguments,jq,Python,Json,Command Line Arguments,Jq,根据中的一个答案,可以使用nargs成功通过列表 但是,我不知道当列表实际上是从json文件检索时,如何正确地传递列表。所有的尝试都会返回一个列表,我想知道如何从命令行成功地实现这一点(即在python脚本中不使用json解析) 主要尝试使用一个玩具的例子(非常类似于上面提到的一个帖子) 应用程序解析列表.py import argparse #定义的命令行选项 #这也会生成帮助和错误处理 CLI=argparse.ArgumentParser() CLI.add_参数( “--lista”,#
nargs
成功通过列表
但是,我不知道当列表实际上是从json文件检索时,如何正确地传递列表。所有的尝试都会返回一个列表,我想知道如何从命令行成功地实现这一点(即在python脚本中不使用json解析)
主要尝试使用一个玩具的例子(非常类似于上面提到的一个帖子)
应用程序解析列表.py
import argparse
#定义的命令行选项
#这也会生成帮助和错误处理
CLI=argparse.ArgumentParser()
CLI.add_参数(
“--lista”,#CLI上的名称-删除位置/所需参数的“---”
nargs=“*”,#0或更多期望值=>创建一个列表
类型=str,
默认值=[“1”、“2”、“3”],#如果未提供任何内容,则为默认值
)
#解析命令行
args=CLI.parse_args()
#访问CLI选项
打印(“列表A:%r”%args.lista)
file.json
{“字段”:[6,7,8]}
从CLI:
inlist=$(jq-r'.field | join(“”)file.json)
python app_parsing_lists.py--lista$inlist
它打印lista:['678']
但是需要的行为是lista:['6','7','8']
怎样才能做到这一点呢?简而言之:不要加入
更具体地说:
$ python app_parsing_lists.py --lista $(echo '{"field": [6, 7, 8]}' | jq -r .field[])
lista: ['6', '7', '8']
在长:考虑这些例子,所有使用<代码> %R -< /P> 警告 如果任何列表项包含空格,则需要采用不同的方法,如下所示:
$ lista=("a b" 2 3)
$ for i in "${lista[@]}" ; do echo $i ; done
a b
2
3
$ python app_parsing_lists.py --lista "${lista[@]}"
lista: ['a b', '2', '3']
$ lista=($(echo '{"field": ["a b", 7, 8]}' | jq .field[]))
$ python app_parsing_lists.py --lista "${lista[@]}"
lista: ['"a', 'b"', '7', '8']
解决方案
unset lista
而IFS=读取-r行;do lista+=($line)
完成<您正在使用.join()返回一个与传递的参数分隔的字符串,Try split()让您尝试%s
而不是%r
。您也可以打印args
,查看args的使用情况。检查inlist
以查看它是否包含”
。并使用--inlist 6 7 8
行为再次检查如何使用jq
获取inlist=(“4”“5”“6”)
?如果我删除连接并运行inlist=$(jq-r'.field'file.json)
它仍然不起作用。
$ lista=("a b" 2 3)
$ for i in "${lista[@]}" ; do echo $i ; done
a b
2
3
$ python app_parsing_lists.py --lista "${lista[@]}"
lista: ['a b', '2', '3']
$ lista=($(echo '{"field": ["a b", 7, 8]}' | jq .field[]))
$ python app_parsing_lists.py --lista "${lista[@]}"
lista: ['"a', 'b"', '7', '8']
unset lista
while IFS= read -r line ; do lista+=($line)
done < <(printf "%s\n" '{"field": ["a b", 7, 8]}' | jq -r .field[])
$ python app_parsing_lists.py --lista ${lista[@]}
lista: ['a b', '7', '8']
$