6

如何使用 argparse 将任意字符串定义为可选参数?

例子:

[user@host]$ ./script.py FOOBAR -a -b
Running "script.py"...
You set the option "-a"
You set the option "-b"
You passed the string "FOOBAR"

理想情况下,我希望论点的立场无关紧要。IE:

./script.py -a FOOBAR -b== ./script.py -a -b FOOBAR==./script.py FOOBAR -a -b


在 BASH 中,我可以在使用getopts. 在 case 循环中处理完所有需要的开关后,我会有一行读取shift $((OPTIND-1)),从那里我可以使用标准$1$2$3等访问所有剩余的参数...
argparse 是否存在类似的东西?

4

1 回答 1

6

为了得到你正在寻找的东西,诀窍是使用parse_known_args()而不是parse_args()

#!/bin/env python 

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-a', action="store_true")
parser.add_argument('-b', action="store_true")

opts = parser.parse_known_args()
# Print info about flags
if opts[0].a: print('You set the option "-a"')
if opts[0].b: print('You set the option "-b"')
# Collect remainder (opts[1] is a list (possibly empty) of all remaining args)
if opts[1]: print('You passed the strings %s' % opts[1])

编辑:

上述代码显示以下帮助信息:

./clargs.py -h

用法:clargs_old.py [-h] [-a] [-b]

可选参数:
  -h, --help 显示此帮助信息并退出
  -一个
  -b

如果您想告知用户可选的任意参数,我能想到的唯一解决方案是将 ArgumentParser 子类化并自己编写。

例如:

#!/bin/env python 

import os
import argparse

class MyParser(argparse.ArgumentParser):
    def format_help(self):
        help = super(MyParser, self).format_help()
        helplines = help.splitlines()
        helplines[0] += ' [FOO]'
        helplines.append('  FOO         some description of FOO')
        helplines.append('')    # Just a trick to force a linesep at the end
        return os.linesep.join(helplines)

parser = MyParser()
parser.add_argument('-a', action="store_true")
parser.add_argument('-b', action="store_true")

opts = parser.parse_known_args()
# Print info about flags
if opts[0].a: print('You set the option "-a"')
if opts[0].b: print('You set the option "-b"')
# Collect remainder
if opts[1]: print('You passed the strings %s' % opts[1])

其中显示以下帮助信息:

./clargs.py -h

用法:clargs.py [-h] [-a] [-b] [FOO]

可选参数:
  -h, --help 显示此帮助信息并退出
  -一个
  -b
  FOO 对 FOO 的一些描述

请注意[FOO]在“用法”行和FOO“可选参数”下的帮助中添加的。

于 2013-06-18T01:24:49.037 回答