2015-07-26 4 views
2

Я пытаюсь использовать модуль argparse в моем приложении python. Мое приложение должно запускаться с одним обязательным аргументом без каких-либо префиксов. Я не мог придумать, как это сделать.Использование argparse для обязательного аргумента без префикса

+2

Я предполагаю, что вы хотите что-то вроде 'питон myscript.py argument' быть командой, которая набирается. Мне кажется, что добавление единого позиционного аргумента должно делать то, что вы хотите. –

ответ

5

Вот простой пример использования argparse требовать ровно один целочисленный аргумент:

import argparse 

parser = argparse.ArgumentParser(description='process an integer') 
parser.add_argument('integer', metavar='N', type=int, nargs=1, 
       help='an integer') 
args = parser.parse_args() 
print(args.integer) 

Saving этот код в argparse1.py и запустить его дает:

$ python argparse1.py 5 
[5] 

$ python argparse1.py 
usage: argparse1.py [-h] N 
argpars1.py: error: the following arguments are required: N 

$ python argparse1.py 5 7 
usage: argparse1.py [-h] N 
argparse1.py: error: unrecognized arguments: 7 

$ python argparse1.py test 
usage: argparse1.py N 
argparse1.py: error: argument N: invalid int value: 'test' 

$ python argparse1.py -h 
usage: argparse1.py [-h] N 

process an integer 

positional arguments: 
    N   an integer 

optional arguments: 
    -h, --help show this help message and exit 

Чтобы удалить необязательные аргументы определяют АргументПарсер с add_help = False следующим образом:

Путти нг этот код в argparse2.py и тестирования дает:

$ python argparse2.py 
usage: argparse2.py N 
argparse2.py: error: the following arguments are required: N 

$ python argparse2.py 5 
[5] 

$ python argparse2.py 5 7 
usage: argparse2.py N 
argparse2.py: error: unrecognized arguments: 7 

$ python argparse2.py hello 
usage: argparse2.py N 
argparse2.py: error: argument N: invalid int value: 'hello' 

$ python argparse2.py -h 
usage: argparse2.py N 
argparse2.py: error: the following arguments are required: N 

Все сообщения использования могут быть подавлены путем импорта argparse.SUPPRESS и настройка ArgumentParser с использованием = SUPPRESS следующим образом:

from argparse import ArgumentParser,SUPPRESS 

parser = ArgumentParser(add_help=False, usage=SUPPRESS) 
parser.add_argument('integer', metavar='N', type=int, nargs=1) 
args = parser.parse_args() 
print(args.integer) 

Saving этот код в argparse3.py и работает она дает:

$ python argparse3.py 5 
[5] 

$ python argparse3.py 5 7 9 
argparse3.py: error: unrecognized arguments: 7 9 

$ python argparse3.py -h 
argparse3.py: error: the following arguments are required: N 

ошибка "непризнанные аргументы" жестко закодировано в ArgumentParser.parse_args() (https://hg.python.org/cpython/file/3.4/Lib/argparse.py#l1727) и «требуются следующие аргументы» ошибка отдельно жестко закодирована (https://hg.python.org/cpython/file/3.4/Lib/argparse.py#l1994), не прибегая к модификации из API. Последнее похоже в _parse_known_args (self, arg_strings, namespace), которое, я полагаю, может быть переопределено, но будет связано с копированием около 250 строк кода, чтобы изменить 1 строку, чтобы изменить это сообщение об ошибке.

Тем не менее, можно избежать этих сообщений об ошибках, добавив только один аргумент с nargs = '*' и no type, который эффективно разрешает все командные строки, а затем добавляет настраиваемую обработку ошибок аргументов, включая вашу собственную ошибку и использование Сообщения. Например:

import os 
import sys 
from argparse import ArgumentParser,SUPPRESS 

script = os.path.basename(sys.argv[0]) 
usage = 'usage: ' + script + ' n (int)' 

parser = ArgumentParser(add_help=False, usage=SUPPRESS) 
parser.add_argument('integer', nargs='*') 
args = parser.parse_args() 

if (len(args.integer) == 0): 
    print('error: no argument provided\n', usage, file=sys.stderr, sep = '') 
    sys.exit(1) 


if (len(args.integer) > 1): 
    print('error: too many arguments\n', usage, file=sys.stderr, sep = '') 
    sys.exit(1) 

v = args.integer[0] 

try: 
    v = int(v) 
except ValueError: 
    print("error: '", v, "'", ' is not an integer\n', usage, file=sys.stderr, sep='') 
    sys.exit(1) 

print(v + 2) 

Ввод этого кода в argparse4.py и тестирование дает:

$ python argparse4.py 5 
7 

$ python argparse4.py 
error: no argument provided 
usage: argparse4.py n (int) 

$ python argparse4.py 5 9 
error: too many arguments 
usage: argparse4.py n (int) 

$ python argparse4.py hello 
error: 'hello' is not an integer 
usage: argparse4.py n (int) 
+0

Можно ли печатать собственный код ошибки, если количество аргументов слишком мало или слишком много? –

+0

@Doppelganger - этот формат сообщения об ошибках жестко закодирован в parse_args() по адресу https://hg.python.org/cpython/file/3.4/Lib/argparse.py#l1727, и возможность его кусомизации отсутствует в API. Можно было бы создать новый класс, который наследует от ArgumentParser и переопределяет этот метод. Однако можно подавить сообщения об использовании, и я добавляю информацию об этом до конца моего ответа. –

+0

@Doppelganger - можно избежать жестких сообщений об ошибках и реализовать свои собственные с помощью обработки пользовательских аргументов. Пример этого был добавлен в мой ответ –

Смежные вопросы