2016-11-18 4 views
3

Есть ли способ передать -- в качестве значения для программы Python с использованием argparse без использования знака equals (=)?Python argparse with - as value

командной строки аргументы, которые я добавил в argparser определены, как показано ниже:

parser.add_argument('--myarg', help="my arg description") 

Вы могли бы использовать этот аргумент в такой программе, как это:

python myprogram.py --myarg value123 

Есть ли способ запуска эта программа с - как значением вместо «value123»?

т.е.

python myprogram.py --myarg -- 
+0

Если действие 'store_true', опция не принимает * any * аргумент. – chepner

+0

Даже при знаке равенства '--myarg = -' выглядит так же, как '--myarg --'. – chepner

+0

Производит 'Пространство имен (myarg = [])'. Это путает парсер. Придерживайтесь использования '--' в качестве разделителя и не пытайтесь запутать' argparse' или ваших пользователей. Почему вам нужно рассматривать эту строку как аргумент? – hpaulj

ответ

3

Я подозреваю, что это не будет возможно сделать argparse это сделать изначально. Вы можете предварительно обработать sys.argv, хотя, как неинтрузивный обходной путь.

import sys 
from argparse import ArgumentParser 
from uuid import uuid4 

sentinel = uuid4().hex 

def preprocess(argv): 
    return [sentinel if arg == '--' else arg for arg in argv[1:]] 

def postprocess(arg): 
    return '--' if arg == sentinel else arg 

parser = ArgumentParser() 
parser.add_argument('--myarg', help="my arg description", type=postprocess) 
args = parser.parse_args(preprocess(sys.argv)) 
+0

Я получаю 'Namespace (myarg = [])' из вашего кода - с или без =. – hpaulj

+0

Это своего рода точка. Невозможно получить 'myarg = []', за исключением пропуска в '--'. Со стороны python вы можете сделать с 'myarg' то, что вы хотите сейчас ... – wim

+0

' myarg = [] 'это то, что я ожидал бы для' nargs = '*' 'Action, а не по умолчанию nargs. – hpaulj