2012-10-11 35 views
70

我想在argparse模塊中有一些選項,例如--pm-export但是,當我嘗試使用它時像args.pm-export那樣,我得到的錯誤是沒有屬性pm。我怎樣才能解決這個問題?命令行選項中是否可以有-在argparse中有短劃線的選項

回答

90

作爲indicated in the argparse docs

對於可選的參數的動作,dest的值通常從選項字符串推斷。 ArgumentParser通過採用第一個長選項字符串和來剝離最初的--字符串來生成dest的值。 任何內部-字符將被轉換爲_字符,以確保該字符串是你應該使用args.pm_export有效的屬性名稱

左右。

13

破折號被轉換爲下劃線:

import argparse 
pa = argparse.ArgumentParser() 
pa.add_argument('--foo-bar') 
args = pa.parse_args(['--foo-bar', '24']) 
print args # Namespace(foo_bar='24') 
+2

僅適用於可選參數。必需的連字符保持連字符,因此需要下劃線才能使其可訪問。 – n00dle

54

不幸的是,衝至底線更換不適合positionalarguments(不--前綴),如

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs-dir', 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results-csv', type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>) 

所以工作時,你應該使用第1'參數add_argument()作爲屬性名稱和metavar kwarg到設置它應該如何尋找幫助:

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs_dir', metavar='logs-dir', 
        nargs=1, 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results_csv', metavar='results-csv', 
        nargs=1, 
        type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>]) 
+4

相關的Python錯誤報告:http://bugs.python.org/issue15125。 'argparse'使用'setattr'和'getattr',所以'dest'名稱不必是有效的'dot'屬性名稱。用戶也可以使用'getattr'。 – hpaulj

+3

我只是做'positions_arg = getattr(解析器,'位置參數')' –

+0

正是我需要的 - 我用'metavar'向後做了,並找不出爲什麼它不工作。謝謝! – dwanderson