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