Как можно использовать 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])