2013-11-26 25 views
0

adb shell amcommand (activity manager)有這樣的參數:如何創建一個adb外殼就像在python中的參數解析器?

[--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]] 

據我所知​​是Python的方法來分析論證。我需要一個動作應該:

  • 由2個以上參數(如:--eia key1 1 2 3)(見最後點)
  • 可選
  • 編輯它可以多次重複,例如。 --eia key1 1,2 --eia key2 2,1是有效
  • 第一個參數可以從其餘
  • 其它任選像這樣的參數的類型而不同的可能存在
  • 的例子中的類型具有,的定界符但我想以允許與限定空間,因爲我的實際參數值可能是字符串,我想給他們留下解析到外殼(如果字符串應該-開始,引號幫助:"-asdf"

的其他問題has an answer可以做這與位置參數:

parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]') 
parser.add_argument('file1', nargs=1, metavar='file') 
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS) 
namespace = parser.parse_args() 
namespace.file = namespace.file1 + namespace.file2 

但我不明白這些是否適用於可選參數呢?

隨着我的要求是,開始時使用​​在所有一個好主意?還有其他選擇嗎?

回答

1
- consists of 2 or more arguments (eg. --eia key1 1 2 3) (see last point) 

有一個建議的補丁,將允許nargs2 or more,仿照re {n,m}符號。但現在我認爲nargs='+'是你最好的選擇。重要的是它抓住了必要的論據。您可以在parse_args(自定義type也可以檢查)後檢查'2或更多'。

- is optional 

使用--eia標誌的需要照顧的是

- edit it can occour multiple times, eg. --eia key1 1,2 --eia key2 2,1 is valid 

隨着所允許的--eia標誌,但只有最後一個條目將被保留。但是action='append'會將每個條目保存爲列表(或元組?);所以命名空間將有args.eia = [['key1','1','2'],['key2',...],...]。與動作類型一起玩,並驗證這一點。

- the type of the first argument may differ from the type of the rest 

將值保留爲字符串,然後做自己的轉換是最簡單的。您可以編寫自定義的type(或action)來檢查值。但是代碼與​​之後的代碼類似。

- other optional arguments like this can exist 

這將取決於您如何編寫添加的代碼。

- the example has the delimiter of a , but I'd like to allow delimiting with spaces, because my actual argument values may be strings and I'd like to leave parsing them to the shell (if a string should start with -, quotation marks help: "-asdf") 

主shell,調用腳本的那個,是將命令行分割爲字符串(主要是空格)的主shell。​​使用sys.argv,即字符串列表。如果該列表不是您想要的,那麼您必須在將它傳遞到argparse.parse_args(argv)之前進行調整。

測試​​的常用方法是:

parser.parse_args('--eia key1 1,2 --eia key2 2,1'.split()) 

的複製空間上的主要分裂,但不處理引用和轉義字符將外殼。有一種複製shell動作的方式,但我不得不四處尋找它。