当列表来自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']
$