2016-10-12 9 views
0

Как вы относитесь к нескольким входам через argparse, особенно когда имеются входы по умолчанию и дополнительные входы?Как установить множество переменных с помощью argparse, как обязательных, так и необязательных переменных?

В моем сценарии file.py, пользователи должны ввести два параметра, которые у меня есть в списке

parameters_list = [parameter1, parameter2, parameter3] 

parameter1 = "" # normally in the script, I would set these 
parameter2 = "" 
parameter3 = "" 

Третий параметр parameter3 является параметром по умолчанию.

Сейчас, на мой взгляд, пользователи могут включать флаги во время выполнения python file.py --parameters = 'parameter1', 'parameter2'

parser = argparse.ArgumentParser() 
parser.add_argument('parameters', nargs = '*', help = 'input program parameters') 
params = parser.parse_args() 

Однако

  1. Это не анализирует, каким образом пользователи имеют входные параметры, как:

    --parameters = 'parameter1', 'parameter2'

  2. Как вы относитесь к параметру по умолчанию parameter3?

    На данный момент это будет вызывать при ошибке, так как переменная parameter3 определена в скрипте, но не определена argparse.

ответ

1

Один из методов заключается в анализе параметров как значений, разделенных запятой.

import argparse 
import sys 
parser = argparse.ArgumentParser() 
parser.add_argument('--parameters',nargs='*',help="input program parameters") 
args,unknown = parser.parse_known_args() 
if(unknown): 
    print("Do not use spaces!") 
    sys.exit() 
parameters = args.parameters 
parameters = parameters[0].split(',') 
parameter1 = parameters[0] 
parameter2 = parameters[1] 
parameter3 = "your_value" if len(parameters) < 3 else params[2] 

Конечно пользователь должен ввести в Params, как (без пробелов):

--parameters='parameter1','parameter2','parameter3' 

Также обратите внимание, что для использования --parameters аргумент вы добавляете в синтаксический анализатор должен соответствовать.

+0

И если входных пространств пользователя, каким будет результат? – ShanZhengYang

+0

Глядя на документацию, она все равно будет работать, но 'params = params.split (',')' будет терпеть неудачу. "* *. Все имеющиеся аргументы командной строки собраны в список." –

+0

Вы говорите: 'parse_args()' выполняет только одно задание, а 'parse_args(). Split (',')' будет анализировать эти значения неправильно? – ShanZhengYang

2

Я бы просто определить отдельные параметры для каждого:

p = ArgumentParser() 
p.add_argument("arg1") 
p.add_argument("arg2") 
p.add_argument("arg3", default=5, nargs='?') 

и требуют вызовы как

$ python file.py 3 2 
$ python file.py 3 2 6