2014-03-30 50 views
3

我試圖解決一個問題中Python的argparse功能的Python argparse與多個動作一個參數

我想實現的是,如果指定-k參數,它設置爲默認值(假設5),但是如果-k = 3時, 'K' 現在包含3 ...

下面是一個例子:

python3 test.py -k 

命名空間(K == 5)

python3 test.py -k=3 

命名空間(K == 3)

是否有可能得到這樣的事情?

test.py

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-k ', metavar='n', type=int, default=5, dest='number') 
args = parser.parse_args() 
print(args) 

在此先感謝

+0

嗨羅伯特,我已經編輯後 – jpact

+1

import argparse import sys # split all args with equal sign args = [] for arg in sys.argv[1:]: args.extend(arg.split('=')) # parse the args parser = argparse.ArgumentParser() parser.add_argument('-k', metavar='n', type=int, dest='number', action='append', nargs='?', const=5) args = parser.parse_args(args) print(args.number[0]) 

這可能是由與 '-k =' 開始只分裂ARGS進行更加智能化:

從jmunsch的回答改編如果沒有'-k'怎麼辦?你想要什麼價值? – hpaulj

回答

1

這個怎麼樣:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-k',metavar='n', dest='number', action='append', nargs='?', const=5) 
args = parser.parse_args() 

print(args.number[0]) 

'python3 test.py -k' 輸出:

5 

「 python3 test.py -k = 3'輸出:

3 

使用sys一個例子:

import sys 

k = 5 
for opt in sys.argv: 
    if opt.split('=')[0] == '-k': 
     if '=' in opt: 
      print(opt.split('=')[1]) 
     if '=' not in opt: 
      print(k) 
    elif len(sys.argv) is 1: 
     print('No arguments were supplied') 
+0

感謝您的迴應,但它的工作原理是,問題是'k'和數字之間必須有'='符號:/ 所以可能的選項有: -k = x(k包含用戶定義的數字) -k(k包含默認定義的數字) – jpact

+0

@Creck使用'sys'添加了一個工作版本 – jmunsch

+0

@Creck'-k'標誌有一個尾隨空白我更新了現在應該使用的argparse版本 – jmunsch

0

這是一個黑客攻擊的一位,但你可以用空格替換所有的參數等號,然後對他們使用argparse。如果你想繼續使用argparse,這可能會更好。爲其他論點。

這意味着-k = 3和-k 3都會起作用。雖然也-k = 3 = -k = 4 = -k將被解析而沒有錯誤。

# split all args with equal sign 
args = [] 
for arg in sys.argv[1:]: 
    if arg[:2] == '-k=': 
     args.extend(arg.split('=')) 
    else: 
     args.append(arg) 
+0

感謝您的迴應,但是,我必須阻止接受像你上面提到的選項:( – jpact

相關問題