web-dev-qa-db-fra.com

Comment passer et analyser une liste de chaînes à partir de la ligne de commande avec argparse.ArgumentParser en Python?

Je veux passer une liste de noms dans mon programme écrit en Python à partir de la console. Par exemple, je voudrais utiliser un moyen similaire à cela (je sais que cela ne devrait pas fonctionner à cause de bash):

$ python myprog.py -n name1 name2

J'ai donc essayé ce code:

# 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

Cela a conduit à l'erreur:

usage: myprog.py [-h] [-n NAMES_LIST]
myprog.py: error: unrecognized arguments: name2

Je sais que je pourrais passer les noms avec des guillemets "name1 name2" Et le diviser en mon code args.names_list.split(). Mais je suis curieux, existe-t-il un meilleur moyen de passer la liste des chaînes via le module argparse.

Toute idée serait appréciée.

Merci!

9
Fomalhaut

Vous devez définir --names-list pour prendre un nombre arbitraire d'arguments.

parser.add_argument('-n', '--names-list', nargs='+', default=[])

Notez que les options avec un nombre arbitraire d'arguments ne fonctionnent généralement pas bien avec les arguments de position, cependant:

# Is this 4 arguments to -n, or
# 3 arguments and a single positional argument, or ...
myprog.py -n a b c d
9
chepner

Vous devez utiliser nargs:

parser.add_argument('-n', '--names-list', nargs="*")

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

3
liiight
parser.add_argument('-n', '--names-list', default=[], nargs='+')
1
hello world