argparse хорош для этого, он находится в стандартной библиотеке с 2.7 и 3.2, но в противном случае pip install
.
Ваша основная задача при указании списка переменной длины можетбыть решенным путем создания списка, интерпретируемого как один аргумент в оболочке, используя кавычки (возможно, зависит от вашей оболочки):
% python prog.py 'name title address' spam
, где prog.py содержит
import sys
my_list = sys.argv[1].split()
# my_list is ['name', 'title', 'address']
if 'name' in my_list:
do_something()
или похожие.Используйте аргумент с split для разделения вашего списка:
% python prog.py "you're a foo, lift the bar"
my_list = [x.strip() for x in sys.argv[1].split(',')]
# my_list is ["you're a foo", "lift the bar"]
Но используйте вместо этого argparse;особенно если вы хотите использовать флаги в стиле -c
.
Один из способов интерпретации вашего вопроса:
«Я уже использую argparse, поскольку это разумный способ интерпретации командной строки.аргументы в Python. Как мне указать, что некоторые опции находятся в определенной категории? "
В своем вопросе вы показали пример того, что оболочки, которые я использую, задохнутся;
% python prog.py -v -details=['name', 'title', 'address'] --quickly -t 4
не сможет обработать python для анализа, потому что они будут использовать пробелы для разделения аргументов и могут использовать [и] в качестве синтаксиса оболочки.
Вместо этого я предлагаю следующее
% python prog.py -v --details name title address --quickly -t 4
где файл prog.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', action='store_true')
parser.add_argument('--details', nargs='*')
parser.add_argument('--quickly', action='store_true')
parser.add_argument('-t')
args = parser.parse_args()
#args is Namespace(details=['asdf', 'a', 'a'], quickly=False, t='4', v=True)
details = args.details
#details is ['asdf', 'a', 'a']
Теперь, согласно вашему вопросу, вам не нужно было выполнять синтаксический анализ строки самостоятельно.