Более приятный синтаксический анализ командной строки python

#python #argparse

#питон #argparse аргпарс

Вопрос:

Используя argparse, я создал небольшой скрипт, содержащий анализатор командной строки для моей аналитической программы, которая является частью самодельного пакета python. Это работает отлично, но мне не очень нравится, как это контролировать.

Вот как выглядит код в самом скрипте

 def myAnalysis():

    parser = argparse.ArgumentParser(description='''
        lala''')
    parser.add_argument('-d', '--data',help='')
    parser.add_argument('-e', '--option_1', help='', default=False, required=False)
    parser.add_argument('-f', '--option_2', help='', default=False, required=False)


    # combine parsed arguments
    args = parser.parse_args()code here
 

В дополнение к этому в установочном файле пакета анализа есть еще кое-что

 entry_points={
          'console_scripts': [
              'py_analysis = edit.__main__:myAnalysis'
          ]
 

Как я уже сказал, это работает без каких-либо проблем. Для анализа некоторых данных я должен использовать

 py_analysis --data path_to_data_file
 

Иногда мне нужны некоторые варианты. Для этого он может выглядеть локе

 py_analysis --data path_to_data_file --option_1 True --option_2 True
 

На мой личный вкус, это довольно некрасиво. Я бы предпочел что-то вроде

 py_analysis path_to_data_file --option_1 --option_2
 

Я почти уверен, что это возможно. Я просто не знаю, как это сделать

Комментарии:

1. Взгляните на документ: docs.python.org/3/library/argparse.html . Ты хочешь action='store_true' .

Ответ №1:

Используйте действие store_true

 parser.add_argument('-e', '--option_1', help='', default=False, action ='store_true')
 

Затем, просто добавив в командную строку —option_1, его значение будет равно True.

Ответ №2:

Чтобы иметь позиционный аргумент вместо параметра, замените:

 parser.add_argument('-d', '--data',help='')
 

Автор::

 parser.add_argument('data_file', help='')
 

Комментарии:

1. Добавление типа =argparse. FileType(<режим доступа>) будет напрямую создавать объект file — вместо строки с именем файла,

2. Жаль, я не могу принять два ответа, ваш и один из @volcano в сочетании — это именно то, что я хотел

3. @Glostas нет проблем 😉