标签: argparse

在python中,如何在父解析器的参数中读取子分析器?

这是一个示例代码:

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是一个有效的论点.

python argparse

14
推荐指数
2
解决办法
5699
查看次数

如何定义两个位置参数的互斥组?

我想用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)

知道怎么做对吗?在这种情况下,我也想避免使用子解析器.

python python-2.7 argparse

14
推荐指数
2
解决办法
8249
查看次数

Argparse - 不要用'nargs`捕获位置参数.

我正在尝试编写一个函数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 argument-passing argparse

14
推荐指数
2
解决办法
4078
查看次数

如何让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的堆栈上,或者是那种效果吗?

python python-2.7 argparse

14
推荐指数
2
解决办法
9688
查看次数

使用unittest discover传递参数(对于argparse)

foo是一个具有深层目录嵌套的Python项目,包括unittest各种子目录中的~30个文件.在foos内setup.py,我在内部运行了一个自定义的"test"命令

 python -m unittest discover foo '*test.py'
Run Code Online (Sandbox Code Playgroud)

请注意,这使用了unittest发现模式.


由于一些测试非常慢,我最近决定测试应该有"级别".这个问题的答案非常清楚地说明了如何相处unittestargparse相互配合.所以,现在,我可以运行一个单独的单元测试文件,比方说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 …

python command-line argparse python-unittest

14
推荐指数
3
解决办法
4905
查看次数

argparse:必需组中的一些互斥参数

我有一组参数可以在逻辑上分为两组:

  • 操作: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)

python argparse

14
推荐指数
1
解决办法
1937
查看次数

在python argparse中,是否有一个用例为nargs = 1?

似乎总是更有意义的是使用默认操作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)

python argparse

14
推荐指数
1
解决办法
5111
查看次数

argparse接受一切

有没有办法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)

可以这样做吗?

python argparse

13
推荐指数
1
解决办法
2485
查看次数

不要在argparse的print_help()中显示两次长选项

我有以下代码:

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)

python argparse

13
推荐指数
2
解决办法
3164
查看次数

为什么这个argparse代码在Python 2和3之间表现不同?

下面的代码,使用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)

python python-2.x argparse python-3.x

13
推荐指数
1
解决办法
3159
查看次数