2017-02-13 14 views
0

У меня есть пользовательская функция в скрипте python, который я вызываю через командную строку. В этой функции есть 3 требуемых параметра и 3 необязательных.Передача переменной числа обязательных и необязательных аргументов через командную строку

Так определение функции выглядит следующим образом:

def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100): 

Когда я вызываю функцию на CL I может или не может установить последние три входных переменных. Для того, чтобы вызвать эту функцию, используя эти входы, прямо сейчас у меня есть:

if __name__ == '__main__': 
    import sys 
    main(sys.argv[1], sys.argv[2], sys.argv[3]) 

Но сказать, что я хочу, чтобы установить тр = 50, то этот вызов пропускает этот аргумент. Однако, если я перейду к sys.argv [6], это не удастся, если я не укажу еще 3 необязательных аргумента.

Есть ли лучший способ, кроме следующего блока, предоставить эти аргументы основной функции?

if __name__ == '__main__': 
    import sys 

    if len(sys.argv) == 4: # i.e. 3 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3]) 

    if len(sys.argv) == 5: # i.e. 4 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 

    if len(sys.argv) == 6: # i.e. 5 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]) 

    if len(sys.argv) == 7: # i.e. 6 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6]) 

ТАКЖЕ, если я называю сценарий (с, если заявления, как выше) из командной строки, как это:

python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50 

, когда я «печать рп» в основной функции, это возвращение ' RP = 50' . Я думал, что установка rp = 100 в определении функции указала, что rp является необязательным аргументом, значение по умолчанию которого равно 100, а явное обращение к «rp = 50» должно переопределить значение по умолчанию и установить rp на 50, а не «rp = 50»,

Наконец, когда я называю сценарий вроде этого:

python script.py 'csvFile.csv' 'path/to/directory' 'batchName' rp=50 

переменная mapprj становится установлено значение «гр = 50», doP2D является верной на значения по умолчанию, и гр остающеся значение по умолчанию из 100. Я думал, что вышеупомянутый вызов должен был сохранить mapprj и doP2D в качестве значений True по умолчанию и установить rp на 50, поскольку я явно установил его на 50.

Что я делаю неправильно?

Благодаря

+1

, что вы ищете модуль под названием 'argparse' – Nullman

ответ

1

Разбирают аргументы из командной строки с помощью argparse, делая все требуемые позиционные аргументы, а просто распаковывать Dict из разобранной арг и передавать его в функцию:

import argparse 


if __name__ == '__main__': 
    ap = argparse.ArgumentParser() 
    ap.add_argument("-c", "--csv", required=True, help = "filename") 
    ... 
    kwargs = vars(ap.parse_args()) 
    main(**kwargs) 
+0

спасибо, Моисей. Я попытался сделать это (замените -c на -incsv), но продолжайте получать TypeError: main() получил неожиданный аргумент ключевого слова «incsv» ... Что это значит, вы знаете? – user20408

+0

безразлично. Я обошел это, но теперь, даже когда я поставлю один из необязательных аргументов что-то другое, чем оно по умолчанию, оно по-прежнему не будет отменять значение по умолчанию. Поэтому, если один из моих аргументов добавлен следующим образом: ap.add_argument ("- mapprj", default = True, type = bool И если я вызываю функцию с 3 обязательными значениями плюс -mapprj = False или -mapprj False, это все равно передается как True. Любая идея почему? – user20408

+0

Это относится только к mapprj и doP2D, которые являются логическими. Установка rp на самом деле работает. Однако, если я задал значение по умолчанию False, а затем в CL установил его в True , что действительно работает. Почему бы не наоборот и как я могу это исправить? Извините за все комментарии – user20408