Python Argparse 多次使用相同的参数

Posted

技术标签:

【中文标题】Python Argparse 多次使用相同的参数【英文标题】:Python Argparse use the same argument multiple times 【发布时间】:2021-06-05 08:29:24 【问题描述】:

大家好,我遇到了一个问题,所以基本上,我正在使用 Argparse 并希望多次使用相同的参数

--filter 从 dict 列表过滤器中获取参数,--parameters--filter 传递所选方法的参数

即:

python filename.py --filter filtermax \
                   --parameter hello 2 \
                   --filter filterPlus \
                   --parameter 6 "hello 9 \
                   --filter printer \
                   --parameter Bye
filters = 
    "filtermax": filtermax, #(2 parameters String,Int)
    "filtermin": filtermin, #(2 parameters String,Int)
    "filterPlus": filterPlus, #(3 parameters Int,String,Int)
    "printer": printer, #(1 parameter String)
    "printer2": printer2 #(1 Parameter String)


parser = argparse.ArgumentParser()
parser.add_argument('--filter',choices=list(filters.keys()))
parser.add_argument('--parameter',nargs='+')

args = parser.parse_args()
filt = args.filter
para = args.parameter
data = filters[filt](*para)

【问题讨论】:

您面临的错误/问题是什么,从您发布的问题中不清楚 【参考方案1】:

如果我正确理解您的问题,您正在寻找的是add_arguments()'s action='append'

根据documentation:

'append' - 存储一个列表,并将每个参数值附加到列表中。这对于允许多次指定一个选项很有用。

在您的情况下,这将为filter 创建一个参数列表和一个parameter 列表列表(将此参数重命名为parameters 是有意义的)。

您必须稍微调整您的代码并添加检查以查看传入的参数数量是否匹配。

import argparse

filters = 
    "filtermax": None,
    "filtermin": None,
    "filterPlus": None,
    "printer": None,
    "printer2": None,

parser = argparse.ArgumentParser()
parser.add_argument('--filter', choices=filters.keys(), action='append')
parser.add_argument('--parameter', nargs='+', action='append')

args = parser.parse_args()
filt = args.filter
# With `nargs='+'` and `action='append'`
# `args.parameter` becomes a list of lists of strs!
para = args.parameter

if len(filt) != len(para):
    raise SystemExit("Number of arguments for filter and parameter don't match!")

# Assuming your intention is to populate the existing `filters` dict:
for fil, par in zip(filt, para):
    filters[fil] = par

print(filters)

# With the arguments you've specified, the output will look like:
# 
#   'filtermax': ['hello', '2'],
#   'filtermin': None,
#   'filterPlus': ['6', 'hello', '9'],
#   'printer': ['Bye'],
#   'printer2': None
#

注意事项:

看起来在您的命令行调用中,有一个不匹配的单双引号,即"hello。为此(在 bash 中),您需要删除它或匹配它,即 hello"hello"

在生产型环境中,我会添加一些其他检查,例如检查是否完全指定了 --parameter--filter,或者在 add_argument() 中使用 required argument,如果出现则优雅退出有什么东西不见了。

即使add_argument()type parameter,您的情况可能过于具体而无法使用它。使用上面的解决方案,filtersdict 将包含作为lists 的strs 传递给--parameter 的参数。如果您想对传入的参数强制执行特定类型,例如

(3 个参数 Int,String,Int)

parse_args() 获取参数后,您需要进行额外检查。

【讨论】:

以上是关于Python Argparse 多次使用相同的参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 optparse 或 argparse 处理使用相同选项的多个参数

Python 处理脚本的命令行参数:使用argparse

子命令中选项的 argparse 冲突解决程序将关键字参数转换为位置参数

python之定义参数模块argparse的基本使用

python 命令行参数——argparse模块的使用

使用 argparse 和 python 接受字典作为参数 [重复]