Как можно использовать argparse в python с предопределенной строкой аргумента?

Я хочу использовать модуль argparse pythons для разбора строки моего параметра cli. Это работает для параметров, передаваемых из терминала, но не с заданной строкой.

import argparse

parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')

argString = 'someTestFile'
print(argString)

args = parser.parse_args(argString)

Если я запускаю этот скрипт, я получаю этот вывод:

~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e

~/someTestFile каким-то образом превращается в o m e T e s t F i l e, Как уже упоминалось, это работает, если я передаю имя файла из терминала.

Я мог представить, что это как-то связано со строковым кодированием. У кого-нибудь есть идеи как это исправить?

4 ответа

Решение

Ах, нет, нет, нет. parser.parse_args() ожидает последовательность в той же форме, что и sys.argv[1:], Если вы рассматриваете строку как последовательность sys.argv, вы получаете ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e'], 's' становится релевантным аргументом, а затем оставшаяся часть строки не разбирается.

Вместо этого вы, вероятно, хотите передать parser.parse_args(['someTestFile'])

Другой вариант - использовать shlex.split. Это особенно удобно, если у вас есть реальная строка аргументов CLI:

import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))

Так же, как по умолчанию sys.argv это список, ваши аргументы должны быть также списком.

args = parser.parse_args([argString])

Просто split ваша командная строка:

args = parser.parse_args(argString.split())

Полный пример для демонстрации:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids')
    argString = "--dummy_opt 128 128"
    args = parser.parse_args(argString.split())

    print(args)

будет выводить:

Namespace(pic_resize=[128, 128])

Другие вопросы по тегам