在 argparse 中有带有破折号的选项

问题描述 投票:0回答:6

我想在argparse模块中有一些选项,例如

--pm-export
,但是当我尝试像
args.pm-export
那样使用它时,我收到错误,没有属性
pm
。我该如何解决这个问题?命令行选项中是否可以有
-

python argparse
6个回答
357
投票

argparse

文档中
所示:

对于可选参数操作,dest 的值通常是从选项字符串推断出来的。 ArgumentParser 通过获取第一个长选项字符串并

剥离初始的--

字符串
来生成 dest 的值。 任何内部 -
 字符都将转换为 
_
 字符
,以确保该字符串是有效的属性名称

所以你应该使用

args.pm_export


158
投票
不幸的是,破折号到下划线的替换不适用于位置参数(不以

--

 为前缀的参数)。
例如:

import argparse import sys 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) # Namespace(**{'logs-dir': './', 'results-csv': <_io.TextIOWrapper name='mydata.csv' mode='w' encoding='UTF-8'>})
因此,您应该使用 

add_argument()

 的第一个参数作为属性名称,并传递 
metavar
 kwarg 来设置它在帮助中的显示方式:

parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('logs_dir', metavar='logs-dir', help='Directory with .log and .log.gz files') parser.add_argument('results_csv', metavar='results-csv', type=argparse.FileType('w'), default=sys.stdout, help='Output .csv filename') args = parser.parse_args() print(args) # Namespace(logs_dir='./', results_csv=<_io.TextIOWrapper name='mydata.csv' mode='w' encoding='UTF-8'>)
    

27
投票
破折号转换为下划线:

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

4
投票
简洁明了但可能并不总是可以接受的方式是使用

vars()

:

#!/usr/bin/env python3 import argparse parser = argparse.ArgumentParser() parser.add_argument('a-b') args = vars(parser.parse_args()) print(args['a-b'])
    

3
投票

getattr(args, 'positional-arg')


这是位置参数的另一个好的解决方法:

#!/usr/bin/env python3 import argparse parser = argparse.ArgumentParser() parser.add_argument('a-b') args = parser.parse_args(['123']) assert getattr(args, 'a-b') == '123'
在 Python 3.8.2 上测试。


0
投票
我想最后一个选项是将缩短选项

-a

 更改为 
--a

import argparse parser = argparse.ArgumentParser(description="Help") parser.add_argument("--a", "--argument-option", metavar="", help="") # change here args = parser.parse_args() option = args.a # And here print(option)
    
© www.soinside.com 2019 - 2024. All rights reserved.