Скрипт командной строки Python. Два сценария использования. Как реализовать разбор аргументов?
У меня есть скрипт командной строки Python, который можно использовать двумя различными способами.
Первый сценарий такой:
script.py -max MAX -min MIN -delta DELTA
где -max
а также -min
необходимы аргументы и -delta
не является обязательным.
Второй сценарий:
script.py some_file.txt -f
где some_file.txt
требуется позиционный аргумент и -f
не является обязательным.
Как мне реализовать это, используя любой анализатор аргументов командной строки Python (argparse, optparse, getopt и т. Д.)?
ОБНОВЛЕНИЕ: скрипт делает только одно - очищает сайт. Но это очень долгая по времени операция. В первом случае мы запускаем новый сеанс очистки, а во втором загружаем ранее сохраненный сеанс и продолжаем удаление.
3 ответа
Я бы сделал это так:
parser = OptionParser()
parser.add_option("-max", dest="max")
parser.add_option("-min", dest="min")
parser.add_option("-delta", dest="delta")
parser.add_option("-f", dest="f_thing", action="store_true")
(options,args) = parser.parse_args()
if not args:
if not options.max or not options.min:
parser.error("Please provide a max and min value.")
else:
yourfunction(options, args) # without some_file.txt name
else:
yourfunctions(options, args) # pass the some_file.txt name
Я не уверен, если это на 100% то, что вы хотите, но я думаю, что этот вопрос слишком близко. Это даст вам некоторое представление о том, как ваша цель может быть достигнута.
Эти два случая кажутся мне достаточно разными, и я хотел бы использовать два отдельных сценария. Если они используют общий код, поместите его в свой собственный модуль и импортируйте его в каждый скрипт.
Если вы хотите использовать один скрипт, почему бы не использовать подпарасер? Затем вы вызываете свой сценарий и явно указываете, какой сценарий вы хотите, например:
script.py calc -max MAX -min MIN -delta DELTA
или же
script.py read some_file.txt -f
(Где "calc" и "read" - это, конечно, любые имена, которые вы хотите использовать для этих двух функций.)
Если вы используете argparse вместо optparse, вы можете указать обязательные аргументы отдельно от необязательных, пропустив "-" перед буквой
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('min', help="min value for function")
parser.add_argument('max', help="max value for function")
parser.add_argument('-d','--delta', type=int, help="the delta value")
args = parser.parse_args()
print args
и я могу бежать так:
$ argtest.py -d 10 5 20
Namespace(delta=10, max='20', min='5')