Скрипт командной строки 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')
Другие вопросы по тегам