У меня есть функция ниже как часть сканера каталогов:
def get_args():
cwd = os.getcwd()
parser = argparse.ArgumentParser(description='Scan all files')
parser.add_argument("path", help = "Path to folder", nargs='?', default=cwd)
parser.add_argument("print", help = "Print file extensions", nargs='?', default=False)
return parser.parse_args()
Scan /usr/Ari True
Это отсканирует указанную папку и распечатает список
Scan
Будет сканировать текущий рабочий каталог, в котором я нахожусь в терминале
Scan True
Не работает, потому что предполагает, что я вхожу в каталог. Как использовать значение по умолчанию для первого аргумента, но указать второй?
Вы понимаете, что по определению print
будет False
логическим значением или строкой, а не True
логическим значением?
@hpaulj Да, я не хочу, чтобы он что-либо печатал, пока я не скажу «Истина». Поэтому, если бы я хотел напечатать, я бы написал Scan /some/directory True
, тогда он напечатает более подробный результат. Если оставить значение False по умолчанию, будет напечатано только минимальное количество. Это работает, поверьте мне. Моя проблема передает второй аргумент, когда он ожидает два.
Вы можете посмотреть на args.path
. Если это «Истина», а не путь, подобный строке, тогда предположим, что ваш пользователь хочет использовать путь по умолчанию. Но зачем вообще использовать argparse
. Просто посмотрите на sys.argv[1:]
.
Как правило, использовать несколько positionals
с ?' (or '*+')
наргами — не лучшая идея. Первый аргумент жадный, поэтому у вас нет хорошего контроля над их назначением. Он присваивает значения по положению, а не по значению. Используйте отмеченные опции, если вы хотите больше контроля. Или сделайте свой разбор.
Отвечать:
def get_args():
cwd = os.getcwd()
parser = argparse.ArgumentParser(description='ScanDirecotry.py --path <path> --print (remove --print if you dont want to print.)')
parser.add_argument("--path", help = "Path to folder", default=cwd)
parser.add_argument("--print", help = "Print file extensions", action='store_true')
return parser.parse_args()
path
получает первую строку, если она есть.print
получает строку, только если указано 2.argparse
не может «знать», что «Истина» предназначена для второго позиционного аргумента. Почему вы не используете--print'
сstore_true
?