Разбор аргументов в argparse на другие аргументы ⇐ Python
Разбор аргументов в argparse на другие аргументы
Я определяю анализатор аргументов в скрипте Python (script.py) следующим образом:
импортировать арпарс импортировать систему # определяем парсер синтаксический анализатор = argparse.ArgumentParser() parser.add_argument("-a", тип=int) parser.add_argument("-b", action="store_true") parser.add_argument("-c", тип=str) # и проанализировать аргументы из sys.argv или списка parser.parse(sys.argv[1:]) Если я вызову свою программу следующим образом (вызов 1):
python script.py -c "-a 1" sys.argv[1:] выглядит как ["-c", "-a 1"]. Это то, чего я ожидал до сих пор. Здесь я хочу, чтобы результирующее пространство имен было:
Namespace(a=0, b=False, s=['-a 1']) Но argparse считывает второй элемент списка не как аргумент -c, а как отдельный аргумент и выдает ошибку, поскольку -s ожидает один аргумент. Я внимательно изучил argparse, так как до сих пор считал, что это ошибка в argparse. Итак, я локально "исправил" argparse, чтобы он обнаруживал "-a 1" как аргумент -c, а не как аргумент -a. (По сути, я сказал argparse, что существует разница между "-a 1" и "-a=1".)
Но потом я понял, что это не помогает при вызове моего скрипта (вызов 2):
python script.py -c "-b" поскольку мой трюк больше не работает (нет возможности =, которую нельзя было бы обнаружить). Здесь я ожидаю получить:
Namespace(a=0, b=False, s=['-b']) но argparse снова считывает "-b" как новый аргумент и жалуется, что -s не имеет аргумента. И здесь я не могу обмануть argparse, потому что он должен уметь различать вызов 2 и этот (вызов 3):
python script.py -c -b Но для обоих вызовов 2 и 3 sys.argv[1:] выглядит как ["-c", "-b"].
Тогда я подумал, что это может быть ошибка в библиотеке sys, и вызовы 2 и 3 должны оказаться в двух разных массивах, то есть ["-c", "\" -b\""] и ["-c", "-b"], но это может привести к поломке многих других приложений, использующих текущую реализацию sys.
Для моего конкретного случая я нашел способ заставить argparse анализировать мои данные так, как я хочу, путем изменения sys.argv[1:] перед передачей их анализатору. Но в целом я не знаю, как решить проблему/несоответствие или нужно просто принять это.
Я определяю анализатор аргументов в скрипте Python (script.py) следующим образом:
импортировать арпарс импортировать систему # определяем парсер синтаксический анализатор = argparse.ArgumentParser() parser.add_argument("-a", тип=int) parser.add_argument("-b", action="store_true") parser.add_argument("-c", тип=str) # и проанализировать аргументы из sys.argv или списка parser.parse(sys.argv[1:]) Если я вызову свою программу следующим образом (вызов 1):
python script.py -c "-a 1" sys.argv[1:] выглядит как ["-c", "-a 1"]. Это то, чего я ожидал до сих пор. Здесь я хочу, чтобы результирующее пространство имен было:
Namespace(a=0, b=False, s=['-a 1']) Но argparse считывает второй элемент списка не как аргумент -c, а как отдельный аргумент и выдает ошибку, поскольку -s ожидает один аргумент. Я внимательно изучил argparse, так как до сих пор считал, что это ошибка в argparse. Итак, я локально "исправил" argparse, чтобы он обнаруживал "-a 1" как аргумент -c, а не как аргумент -a. (По сути, я сказал argparse, что существует разница между "-a 1" и "-a=1".)
Но потом я понял, что это не помогает при вызове моего скрипта (вызов 2):
python script.py -c "-b" поскольку мой трюк больше не работает (нет возможности =, которую нельзя было бы обнаружить). Здесь я ожидаю получить:
Namespace(a=0, b=False, s=['-b']) но argparse снова считывает "-b" как новый аргумент и жалуется, что -s не имеет аргумента. И здесь я не могу обмануть argparse, потому что он должен уметь различать вызов 2 и этот (вызов 3):
python script.py -c -b Но для обоих вызовов 2 и 3 sys.argv[1:] выглядит как ["-c", "-b"].
Тогда я подумал, что это может быть ошибка в библиотеке sys, и вызовы 2 и 3 должны оказаться в двух разных массивах, то есть ["-c", "\" -b\""] и ["-c", "-b"], но это может привести к поломке многих других приложений, использующих текущую реализацию sys.
Для моего конкретного случая я нашел способ заставить argparse анализировать мои данные так, как я хочу, путем изменения sys.argv[1:] перед передачей их анализатору. Но в целом я не знаю, как решить проблему/несоответствие или нужно просто принять это.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение