2017-04-26 56 views
1

我在这里简化了我的问题。我需要这样做:python argparse不带字符串选项以“ - ”开头

python test.py --arg1 '--no-route53' 

我说这样的解析器:

parser.add_argument("--arg1", nargs="?", type=str, help="option") 
args = parser.parse_args() 

我希望得到“--no-route53”整个字符串,后来在我的脚本中使用它。但我不断收到此错误:

test.py: error: unrecognized arguments: --no-route53 

我该如何解决它?

UPDATE1:如果我给后“--no-route53”,这样额外的空间和它的工作:

python test.py --arg1 '--no-route53 ' 
+2

使用的参数值'蟒蛇test.py --arg1 ='面前是平等的象征 - 无route53'' – jpnkls

+0

该字符串看起来像一个选项标志。认为解释优先于将其视为先前可选的论点。 shell不保留额外的引号。 – hpaulj

回答

0

我前一阵子有完全相同的问题。我结束了预解析sys.argv列表:

def bug_workaround(argv): 
    # arg needs to be prepended by space in order to not be interpreted as 
    # an option 
    add_space = False 
    args = [] 
    for arg in argv[1:]: # Skip argv[0] as that should not be passed to parse_args 
     if add_space: 
      arg = " " + arg 
     add_space = True if arg == "--args" else False 
     args.append(arg) 

    return args 


parser = argparse.ArgumentParser(description='My progrm.') 
. 
. 
. 
parser.add_argument('--args', type=str, 
        help='Extra args (in "quotes")') 

args = parser.parse_args(bug_workaround(sys.argv)) 
# Prune added whitespace (for bug workaround) 
if args.args: 
    args.args = args.args[1:] 
+0

我看到的最简单的方法是添加“=”它:python3 test.py --arg1 =' - no-route53' –

+0

是的,但这需要用户意识到这一点。情况并非总是如此。 – JohanL