如何使用Python中的argparse.ArgumentParser从命令行传递和解析字符串列表?

Fom*_*aut 7 python argparse

我想将一个名字列表传递给我从控制台用Python编写的程序.例如,我想使用类似于此的方法(我知道它不应该工作因为bash):

$ python myprog.py -n name1 name2
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了这段代码:

# myprog.py

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument('-n', '--names-list', default=[])
args = parser.parse_args()

print(args.names_list) # I need ['name1', 'name2'] here
Run Code Online (Sandbox Code Playgroud)

这导致了错误:

usage: myprog.py [-h] [-n NAMES_LIST]
myprog.py: error: unrecognized arguments: name2
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用引号传递名称"name1 name2"并将其拆分为我的代码args.names_list.split().但我很好奇,是否有更好的方法通过argparse模块传递字符串列表.

任何想法,将不胜感激.

谢谢!

che*_*ner 9

您需要定义--names-list以获取任意数量的参数.

parser.add_argument('-n', '--names-list', nargs='+', default=[])
Run Code Online (Sandbox Code Playgroud)

请注意,具有任意数量参数的选项通常不能很好地与位置参数一起使用,但是:

# Is this 4 arguments to -n, or
# 3 arguments and a single positional argument, or ...
myprog.py -n a b c d
Run Code Online (Sandbox Code Playgroud)

  • 不可能使用 `--arg=value` 语法吗?像`--arg =“一,二,三”`或类似的而不拆分? (3认同)

小智 7

您需要使用nargs

parser.add_argument('-n', '--names-list', nargs="*")
Run Code Online (Sandbox Code Playgroud)

https://docs.python.org/3/library/argparse.html#nargs