2017-04-26 53 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