这是一个示例代码:
import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparser=parser.add_subparser()
a=subparser.add_parser('run')
a.add_argument('required_sub_arg')
a.add_argument('arg_a')
b=subparser.add_parser('b')
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
-main_arg如果我进入,我希望它能读入program run required_sub_arg -main_arg -arg_a
现在,它不承认-main_arg是一个有效的论点.
我想用argparse以下两种方式来制作一些代码:
./tester.py all
./tester.py name someprocess
Run Code Online (Sandbox Code Playgroud)
即任何all一个指定OR或name一些额外的字符串.
我试图实现如下:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('all', action='store_true', \
help = "Stops all processes")
group.add_argument('name', \
help = "Stops the named process")
print parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误
ValueError: mutually exclusive arguments must be optional
Run Code Online (Sandbox Code Playgroud)
知道怎么做对吗?在这种情况下,我也想避免使用子解析器.
我正在尝试编写一个函数wo,你可以通过argparse解析可变数量的参数 - 我知道我可以通过这个来做nargs="+".遗憾的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)将位置参数放在最后.这导致我的位置参数被捕获为可选参数的一部分.
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("positional", help="my positional arg", type=int)
parser.add_argument("-o", "--optional", help="my optional arg", nargs='+', type=float)
args = parser.parse_args()
print args.positional, args.optional
Run Code Online (Sandbox Code Playgroud)
运行此以./test.py -h显示以下使用说明:
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional
Run Code Online (Sandbox Code Playgroud)
但如果我跑./test.py -o 0.21 0.11 0.33 0.13 100了就给我
test.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
为了正确解析args,我必须运行 ./test.py 100 -o 0.21 0.11 0.33 0.13
那么我该怎么做:
make argparse重新格式化使用输出,以免误导,或者甚至更好:
-o如果它是列表中的最后一个,则告诉argparse不捕获可选参数的最后一个元素
?
我想知道如何使用python的argparse模块从命令行和文本文件中读取参数.我知道argparse的,fromfile_prefix_chars但这不是我想要的.我想要这个行为,但我不想要语法.我想要一个如下所示的界面:
$ python myprogram.py --foo 1 -A somefile.txt --bar 2
Run Code Online (Sandbox Code Playgroud)
当argparse看到-A时,它应该停止从sys.argv或我给它的任何东西读取,并调用我写的函数,它将读取somefile.text并返回一个参数列表.当文件用尽时,它应该继续解析sys.argv或其他什么.重要的是文件中的参数处理顺序发生(即:应该处理-foo,然后处理文件中的参数,然后是-bar,以便文件中的参数可以覆盖--foo,和 - bar可能会覆盖文件中的内容).
这样的事情可能吗?我可以编写一个自定义函数,将新参数推送到argparse的堆栈上,或者是那种效果吗?
foo是一个具有深层目录嵌套的Python项目,包括unittest各种子目录中的~30个文件.在foos内setup.py,我在内部运行了一个自定义的"test"命令
python -m unittest discover foo '*test.py'
Run Code Online (Sandbox Code Playgroud)
请注意,这使用了unittest发现模式.
由于一些测试非常慢,我最近决定测试应该有"级别".这个问题的答案非常清楚地说明了如何相处unittest并argparse相互配合.所以,现在,我可以运行一个单独的单元测试文件,比方说foo/bar/_bar_test.py,与
python foo/bar/_bar_test.py --level=3
Run Code Online (Sandbox Code Playgroud)
并且只运行3级测试.
问题是我无法弄清楚如何使用发现传递自定义标志(在本例中为"--level = 3".我尝试的一切都失败了,例如:
$ python -m unittest discover --level=3 foo '*test.py'
Usage: python -m unittest discover [options]
python -m unittest discover: error: no such option: --level
$ python -m --level=3 unittest discover foo '*test.py'
/usr/bin/python: No module named --level=3
Run Code Online (Sandbox Code Playgroud)
我怎样才能--level=3转到单独的单元测试?如果可能的话,我想避免将不同级别的测试划分为不同的文件.
赏金编辑
pre-bounty(精细)解决方案建议使用系统环境变量.这还不错,但我正在寻找更清洁的东西.
将多文件测试运行器(即python -m …
我有一组参数可以在逻辑上分为两组:
A1,A2,A3等.I1,I2,I3等.程序启动时至少需要其中一个参数,但"信息"参数可以与"动作"参数一起使用.所以
我找不到如何使用argparse来做到这一点.我知道add_mutually_exclusive_group它和它的required论点,但我不能在"行动"上使用它,因为它实际上并不是必需的.当然,我可以在argparse之后添加一个条件来手动检查我的规则,但它看起来像是一个黑客.argparse可以这样做吗?
编辑:对不起,这里有一些例子.
# Should pass
--A1
--I1
--A1 --I2
--A2 --I1 --I2
# Shouldn't pass
--A1 --A2
--A1 --A2 --I1
Run Code Online (Sandbox Code Playgroud) 似乎总是更有意义的是使用默认操作store而不指定,nargs因此输出总是如预期的那样,而不是有时是a list,有时不是.如果我错过了什么,我只是很好奇..
例
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('--bar', nargs=1)
_StoreAction(option_strings=['--bar'], dest='bar', nargs=1, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('--foo 1 --bar 1'.split())
Namespace(bar=['1'], foo='1')
>>> parser.parse_args('')
Namespace(bar=None, foo=None)
Run Code Online (Sandbox Code Playgroud) 有没有办法argparse.ArgumentParser在读取未知选项时不引发异常,而是将所有未知选项的值放在字典中,而将那些没有值放在列表中?
例如,假设解析器中没有定义参数prog.py,我传递了两个参数:
./prog.py --foo bar --baz
Run Code Online (Sandbox Code Playgroud)
我想要以下内容:
parsed = parser.parse_args()
vals = parsed.unknown_with_vals
novals = parsed.unknown_without_vals
print(vals)
#{'foo' : 'bar'}
print(novals)
#['baz']
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
我有以下代码:
parser = argparse.ArgumentParser(description='Postfix Queue Administration Tool',
prog='pqa',
usage='%(prog)s [-h] [-v,--version]')
parser.add_argument('-l', '--list', action='store_true',
help='Shows full overview of all queues')
parser.add_argument('-q', '--queue', action='store', metavar='<queue>', dest='queue',
help='Show information for <queue>')
parser.add_argument('-d', '--domain', action='store', metavar='<domain>', dest='domain',
help='Show information about a specific <domain>')
parser.add_argument('-v', '--version', action='version', version='%(prog)s 0.1')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
这给了我这样的输出:
%./pqa
usage: pqa [-h] [-v,--version]
Postfix Queue Administration Tool
optional arguments:
-h, --help show this help message and exit
-l, --list Shows full overview of all queues
-q <queue>, --queue <queue> …Run Code Online (Sandbox Code Playgroud) 下面的代码,使用argparse的subparsers,在Python 3上失败,但在Python 2中按预期运行.在比较文档后,我仍然无法说明原因.
#!/usr/bin/env python
from __future__ import print_function
from argparse import ArgumentParser
def action(args):
print(args)
if __name__ == '__main__':
std = ArgumentParser(add_help=False)
std.add_argument('standard')
ap = ArgumentParser()
sp = ap.add_subparsers()
cmd = sp.add_parser('subcommand', parents=[std], description='Do subcommand')
cmd.add_argument('arg')
cmd.set_defaults(do=action)
args = ap.parse_args()
args.do(args)
Run Code Online (Sandbox Code Playgroud)
Python 2.7.6的输出是:
me@computer$ python test.py
usage: test.py [-h] {subcommand} ...
test.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
在Python 3.3.5中,我得到:
me@computer$ python3 test.py
Traceback (most recent call last):
File "test.py", line 21, in <module>
args.do(args)
AttributeError: 'Namespace' object has no attribute …Run Code Online (Sandbox Code Playgroud)