我正在尝试在我的python程序上设置argparse,但是它不起作用。
我正在尝试处理的参数如下:
“ --interactive”或第一个参数的整数,其中之一是必需的
“ --xml”或“ --html”或“ --text”或“ --console”中的任何一个。同样,它可以是其中任何一个,但第二个参数需要其中之一
最后是第三个参数,是“ --verbose”标志,它是可选的。
除了第一个参数的整数以外,所有这些参数都将变量更改为True。
这是我目前的代码:
import argparse
parser = argparse.ArgumentParser(description='Python Historical Event Calculator.',
prog='tempus.py')
inputs = parser.add_mutually_exclusive_group(required=True)
exports = parser.add_mutually_exclusive_group(required=True)
inputs.add_argument('integer', metavar='I', type=float,
help='percentage to use')
inputs.add_argument('-i','--interactive', dest='bool_interactive',
action='store_true', help='enter interactive mode')
exports.add_argument('-x','--xml', dest='bool_xml', action='store_true',
help='export output as xml')
exports.add_argument('--html', dest='bool_html', action='store_true',
help='export output as html')
exports.add_argument('-t','--text', dest='bool_text', action='store_true',
help='export output as plaintext')
exports.add_argument('-c','--console', dest='bool_con', action='store_true',
help='export output to console')
parser.add_argument('-v','--verbose', dest='verbose', action='store_true',
help='enter verbose/debug mode', required=False)
args = parser.parse_args()
但是我不知道我是否在正确的轨道上,任何人都可以帮忙吗?这看起来是对的还是我做错了?
编辑
当我传递任何标志给它时,我得到这个回溯:
Traceback (most recent call last):
File "C:\Users\Callum\Dropbox\Tempus\Feature Tests\argparsetest.py", line 9, in <module>
help='percentage to use')
File "C:\Python32\lib\argparse.py", line 1305, in add_argument
return self._add_action(action)
File "C:\Python32\lib\argparse.py", line 1528, in _add_action
raise ValueError(msg)
ValueError: mutually exclusive arguments must be optional
最佳答案
发生错误ValueError: mutually exclusive arguments must be optional
的原因是,您要将integer
(位置参数)添加到互斥组中。互斥组仅用于可选参数,而位置参数始终是必需的。一种解决方案是使interactive
和integer
为可选参数,并使它们互斥。
我最初错过了这样一个事实,即您在模式中使用了mutually_exclusive_group
,因此仅指定了xml,html,控制台或文本,但是如果您确实喜欢这种想法,我确实对其进行了更改。
该解析器将起作用,它使您的interactive
和integer
参数互斥,并使模式成为choice list。
#!/usr/bin/env python
import argparse
def get_parser():
parser = argparse.ArgumentParser(prog='tempus.py')
ex_group = parser.add_mutually_exclusive_group(required=True)
parser.add_argument('--mode', type=str, choices=['html', 'xml', 'text', 'console'], required=True)
parser.add_argument('-v', '--verbose', action='store_true')
ex_group.add_argument('--interactive', action='store_true')
ex_group.add_argument('--integer', metavar='I', type=float, help='percentage to use')
return parser
def main():
aparser = get_parser()
args = aparser.parse_args()
print('mode: %s' % args.mode)
print('integer: %s' % args.integer)
print('interactive: %s' % args.interactive)
print('verbose: %s' % args.verbose)
# Only used in Python 2.x
if __name__ == '__main__':
main()
样品运行:
+> python .\tempus.py
usage: tempus.py [-h] --mode {html,xml,text,console} [-v]
(--interactive | --integer I)
tempus.py: error: argument --mode is required
+> python .\tempus.py --mode html
usage: tempus.py [-h] --mode {html,xml,text,console} [-v]
(--interactive | --integer I)
tempus.py: error: one of the arguments --interactive --integer is required
+> python .\tempus.py --mode html --integer
usage: tempus.py [-h] --mode {html,xml,text,console} [-v]
(--interactive | --integer I)
tempus.py: error: argument --integer: expected one argument
+> python .\tempus.py --mode html --integer 12
mode: html
integer: 12.0
interactive: False
verbose: False
关于python - 在Python 3.2上设置argparse,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9421731/