Как я могу использовать python argparse с предопределенной строкой аргумента?
Я хочу использовать модуль pythons argparse для анализа строки параметров cli. Это работает для параметров pass от терминала, но не с заданной строкой.
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)
Если я запустил этот script, я получаю этот вывод:
~/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
. Как уже упоминалось, он работает, если я передаю имя файла с терминала.
Я мог себе представить, что это имеет какое-то отношение к строковым кодировкам. У кого-то есть идея, как это исправить?
Ответы
Ответ 1
А, нет, нет. 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'])
Ответ 2
Другой вариант - использовать shlex.split. Это особенно удобно, если у вас есть строка аргументов командной строки CLI:
import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
Ответ 3
Так же, как и по умолчанию sys.argv
- список, ваши аргументы также должны быть списком.
args = parser.parse_args([argString])
Ответ 4
Просто 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])