我正在写一个程序,我希望有这样的参数:
--[no-]foo Do (or do not) foo. Default is do.
Run Code Online (Sandbox Code Playgroud)
有没有办法让argparse为我这样做?
我正在使用Python 3.2
当我跑步时parsePlotSens.py -s bw hehe,它说这hehe是一个未被承认的论点.但是,如果我跑parsePlotSens.py hehe -s bw,那没关系.理想情况下,我希望它适用于这两种情况.
有小费吗?以下是我的代码:
if __name__ == '__main__' :
parser = argparse.ArgumentParser(prog='parsePlotSens');
parser.add_argument('-s', '--sort', nargs =1, action = 'store', choices = ['mcs', 'bw'], default='mcs', help=sorthelp)
parser.add_argument('filename', nargs ='+', action = 'store')
option = parser.parse_args(sys.argv)
Run Code Online (Sandbox Code Playgroud) 我做了尽可能多的研究但是我没有找到最好的方法来使某些cmdline参数仅在某些条件下是必要的,在这种情况下只有在给出其他参数的情况下.这是我想要在一个非常基本的层面上做的事情:
p = argparse.ArgumentParser(description='...')
p.add_argument('--argument', required=False)
p.add_argument('-a', required=False) # only required if --argument is given
p.add_argument('-b', required=False) # only required if --argument is given
Run Code Online (Sandbox Code Playgroud)
从我所看到的,其他人似乎只是在最后添加自己的支票:
if args.argument and (args.a is None or args.b is None):
# raise argparse error here
Run Code Online (Sandbox Code Playgroud)
有没有办法在argparse包中本地执行此操作?
我有一个可选参数,支持一个参数列表本身.
我的意思是,它应该支持:
但不是:
有没有办法在argparse中强制执行此操作?现在我使用nargs ="*",然后检查列表长度.
编辑:根据要求,我需要的是能够定义一系列可接受的参数.我的意思是,说(在例子中)2或3个args是正确的,但不是1或4或任何不在2..3范围内的东西
如何使用默认子命令,或处理没有使用子命令的情况argparse?
import argparse
a = argparse.ArgumentParser()
b = a.add_subparsers()
b.add_parser('hi')
a.parse_args()
Run Code Online (Sandbox Code Playgroud)
在这里,我想要选择一个命令,或者只根据下一个最高级别的解析器(在这种情况下是顶级解析器)处理的参数.
joiner@X:~/src> python3 default_subcommand.py
usage: default_subcommand.py [-h] {hi} ...
default_subcommand.py: error: too few arguments 如何限制argparse选项的值?
在下面的代码sau选项应该只接受了一些0或1与bg应只允许一个整数.我该如何实现呢?
import os
import sys, getopt
import argparse
def main ():
parser = argparse.ArgumentParser(description='Test script')
parser.add_argument('-sau','--set',action='store',dest='set',help='<Required> Set flag',required=True)
parser.add_argument('-bg','--base_g',action='store',dest='base_g',help='<Required> Base g',required=True)
results = parser.parse_args() # collect cmd line args
set = results.set
base_g = results.base_g
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 我想有一个程序,需要一个--action=标志,其中有效的选择是dump和upload,与upload被默认.如果(并且仅当)dump被选中,我希望它也是一个--dump-format=选项.有没有办法用argparse表达这个,或者我是否需要接受所有的参数并自己做逻辑.
使用python的argparse,如何使子命令成为必需的参数?我想这样做是因为如果没有指定子命令,我希望argparse出错.我改写错误方法来打印帮助.我有3个深度嵌套子命令,所以这不是简单地在顶层处理零参数的问题.
在下面的示例中,如果这样调用,我得到:
$./simple.py
$
Run Code Online (Sandbox Code Playgroud)
我想要它做的是让argparse抱怨没有指定所需的子命令:
import argparse
class MyArgumentParser(argparse.ArgumentParser):
def error(self, message):
self.print_help(sys.stderr)
self.exit(0, '%s: error: %s\n' % (self.prog, message))
def main():
parser = MyArgumentParser(description='Simple example')
subs = parser.add_subparsers()
sub_one = subs.add_parser('one', help='does something')
sub_two = subs.add_parser('two', help='does something else')
parser.parse_args()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) Python的argparse模块具有所谓的"可选"参数.名称以其开头的所有参数-或--默认情况下是可选的.通常,强制参数是位置参数,因此在运行程序时,它们没有明确命名.
例如,在具有以下内容的脚本中:
parser.add_argument('language', help="Output language")
Run Code Online (Sandbox Code Playgroud)
调用看起来像:
$ hello-world czech
Run Code Online (Sandbox Code Playgroud)
通过名称传递强制参数有时会更好(例如,脚本调用更容易以这种方式阅读),但仍然是强制性的.即
$ hello-world --use-lang czech
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?命名参数在argparse文档中称为"可选" ,这听起来好像它们不是强制性的.有没有办法让他们成为必修课?
有没有比这种模式更好的方式支持Enums作为argparse参数的类型?
class SomeEnum(Enum):
ONE = 1
TWO = 2
parser.add_argument('some_val', type=str, default='one',
choices=[i.name.lower() for i in SomeEnum])
...
args.some_val = SomeEnum[args.some_val.upper()]
Run Code Online (Sandbox Code Playgroud)