2012-10-11 33 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