Принудительное использование аргумента в качестве пути - PullRequest
0 голосов
/ 12 июня 2018

Я пишу простой скрипт, который будет использоваться для анализа содержимого файла JSON, хранящегося в AWS CloudWatch.Я добавил в скрипт синтаксический анализатор аргументов, который будет принимать пользовательский ввод и позволять пользователю либо выводить вывод файла на экран (заранее определенным образом), либо позволять им выводить содержимое в локальный файл JSON.,Вот фрагмент того, что озадачивает меня:

import argparse

parser = argparse.ArgumentParser(description="Process a log file")
parser.add_argument('-o', '--output', choices=[???, 'print'], 
                    default='print', help='Specify logfile output path or print to screen')
args = parser.parse_args()

Мой вопрос проистекает из строки parser.add_argument, в частности аргумента choices.Я хотел бы разрешить два ввода для этого флага, либо print, либо какой-нибудь допустимый путь на их локальной машине.Мне бы хотелось, чтобы выбор, который в настоящее время отмечен вопросительными знаками, был PATH, который Python может распознать.

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Определите пользовательский type (как в https://stackoverflow.com/a/14117511/1093967),, где значение может быть допустимым путем или 'print'. choices не является правильным выбором здесь.

0 голосов
/ 12 июня 2018

Используйте аргумент type ключевого слова до add_argument вместо choices.Как сказано в документации:

Аргумент типа ключевое слово add_argument() позволяет выполнять любые необходимые проверки типов и преобразования типов.

def myfiletype(arg):
    if arg == 'print' or os.path.isdir(arg):
        return arg
    else:
        raise ValueError('Invalid path specification')


parser.add_argument('-o', '--output', type=myfiletype, 
                    default='print', 
                    help='Specify logfile output path or print to screen')
...