标签: argparse

Argparse"ArgumentError:参数-h/ - help:冲突的选项字符串:-h, - help"

最近,我正在学习argparse模块,代码下面发生了Argument错误

import argparse
import sys


class ExecuteShell(object):
    def create(self, args):
        """aaaaaaa"""
        print('aaaaaaa')
        return args

    def list(self, args):
        """ccccccc"""
        print('ccccccc')
        return args

    def delete(self, args):
        """ddddddd"""
        print('ddddddd')
        return args


class TestShell(object):
    def get_base_parser(self):
        parser = argparse.ArgumentParser()
        parser.add_argument('-h',
                            '--help',
                            action='store_true',
                            help=argparse.SUPPRESS)

        parser.add_argument('-c', action='store',
                            dest='create_value',
                            help='create a file')

        parser.add_argument('-d', action='store',
                            dest='delete_value',
                            help='delete a file')

        parser.add_argument('-l', action='store',
                            dest='list_value',
                            help='list a dir')

        return parser

    def _find_actions(self, subparsers, actions_module):
        for attr in (action for action in dir(actions_module) if not  action.startswith('__')):
            callback = getattr(actions_module, attr)
            desc = …
Run Code Online (Sandbox Code Playgroud)

python argparse

29
推荐指数
2
解决办法
2万
查看次数

具有默认选择的python argparse选项

我正在尝试在Python 3应用程序中使用argparse,其中有明确的选择列表,但如果没有指定,则为默认值.

我的代码是:

parser.add_argument('--list', default='all', choices=['servers', 'storage', 'all'], help='list servers, storage, or both (default: %(default)s)') 
args = parser.parse_args()
print(vars(args))
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我得到以下选项:

$ python3 ./myapp.py --list all
{'list': 'all'}
Run Code Online (Sandbox Code Playgroud)

或者没有选项:

$ python3 ./myapp.py --list
usage: myapp.py [-h] [--list {servers,storage,all}]
myapp.py: error: argument --list: expected one argument
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?或者我可以没有指定选项的默认值吗?

python argparse python-3.x

29
推荐指数
2
解决办法
3万
查看次数

Python Argparse:带有可选参数的问题是负数

我有一个小问题argparse.我有一个选项xlim,是xrange一个情节.我希望能够传递数字-2e-5.然而,这不起作用 - argparse解释这是一个位置论证.如果我这样做-0.00002:argparse将其作为负数读取.是否有可能读入-2e-3

代码如下,我将如何运行它的一个例子是:

./blaa.py --xlim -2.e-3 1e4 
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作,它可以工作:

./blaa.py --xlim -0.002 1e4 
Run Code Online (Sandbox Code Playgroud)

代码:

parser.add_argument('--xlim', nargs = 2,
                  help = 'X axis limits',
                  action = 'store', type = float, 
                  default = [-1.e-3, 1.e-3])
Run Code Online (Sandbox Code Playgroud)

虽然我可以通过这种方式使用它,但我真的宁愿能够使用科学记数法.有人有主意吗?

干杯

python negative-number argparse

28
推荐指数
5
解决办法
1万
查看次数

ArgumentParser与ArgumentDefaultsHelpFormatter结合使用的epilog和描述格式

我正在使用argparse接受命令行输入并生成帮助文本.我想用ArgumentDefaultsHelpFormatterformatter_class,但是这防止我也用 RawDescriptionHelpFormatter这将让我的自定义格式添加到我的描述或收尾.

除了自己编写代码以生成默认值的文本之外,还有一种明智的方法可以实现这一目的吗?根据argparse文档,所有内部ArgumentParser都被认为是实现细节,而不是公共API,因此子类化不是一个有吸引力的选择.

python argparse

28
推荐指数
1
解决办法
3528
查看次数

argparse subparser单片帮助输出

我的argparse在顶层只有3个标志(store_true),其他一切都是通过subparsers处理的.当我运行时myprog.py --help,输出显示所有子命令的列表,如normal , {sub1, sub2, sub3, sub4, ...}. 所以,默认工作很好......

我通常记不起我需要的确切子命令名称及其所有选项.所以我最终做了两次帮助查找:

myprog.py --help
myprog.py sub1 --help
Run Code Online (Sandbox Code Playgroud)

我经常这样做,我决定把它塞进一步.我宁愿让我的顶级帮助输出一个巨大的摘要,然后我手动滚动列表.我觉得它要快得多(至少对我来说).

我正在使用RawDescriptionHelpFormatter,并手动输入长帮助输出.但是现在我有很多子命令,它变得很难管理.

有没有办法只用一个程序调用获得详细的帮助输出?

如果没有,我如何迭代我的argparse实例的子分析器,然后从每个实例中单独检索帮助输出(之后我将粘合在一起)?


这是我的argparse设置的快速概述.我清理/剥离了相当多的代码,所以如果没有一些帮助,这可能无法运行.

parser = argparse.ArgumentParser(
        prog='myprog.py',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description=textwrap.dedent(""" You can manually type Help here """) )

parser.add_argument('--debuglog', action='store_true', help='Verbose logging for debug purposes.')
parser.add_argument('--ipyonexit', action='store_true', help='Drop into an embeded Ipython session instead of exiting command.')

subparser = parser.add_subparsers()

### --- Subparser B
parser_b = subparser.add_parser('pdfreport', description="Used to output reports in PDF format.")
parser_b.add_argument('type', type=str, choices=['flatlist', 'nested', 'custom'],
                        help="The type …
Run Code Online (Sandbox Code Playgroud)

python argparse

28
推荐指数
3
解决办法
1万
查看次数

基于argparse的调用函数

我是python的新手,现在正在使用它.我有一个脚本,它可以对设备执行一些API调用.我想扩展功能,并根据调用脚本时给出的参数调用不同的函数.

目前我有以下内容:

parser = argparse.ArgumentParser()
parser.add_argument("--showtop20", help="list top 20 by app",
                    action="store_true")
parser.add_argument("--listapps", help="list all available apps",
                    action="store_true")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

我也有

def showtop20():
    .....
Run Code Online (Sandbox Code Playgroud)

def listapps():
....
Run Code Online (Sandbox Code Playgroud)

如何根据给出的参数调用函数(并且只调用此函数)?我不想跑

if args.showtop20:
   #code here

if args.listapps:
   #code here
Run Code Online (Sandbox Code Playgroud)

因为我想稍后将不同的功能移动到模块上,以保持主要的可执行文件干净整洁.

python argparse

28
推荐指数
4
解决办法
4万
查看次数

Sphinx和argparse - autodocumenting命令行脚本?

我正在构建一个Python包,并使用Sphinx来创建文档.除了我的包代码,我还包括很多使用argparse的命令行Python脚本.我想知道是否有办法让Sphinx自动记录这些脚本?最终目标将是一个漂亮的脚本列表,以及相关的帮助打印,参数和选项.要清楚,我正在寻找一种预先存在的方法来做到这一点,而不是自己实现这一点的方法.

这并不像我通常所问的那样具体,如果有更合适的SE网站发布这个问题,请告诉我.谢谢.

python documentation argparse python-sphinx

27
推荐指数
3
解决办法
3975
查看次数

如何将argparse参数传递给kwargs?

我有一个类定义如下

class M(object):
    def __init__(self, **kwargs):
        ...do_something
Run Code Online (Sandbox Code Playgroud)

我有结果argparse.parse_args(),例如:

> args = parse_args()
> print args
Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever")
Run Code Online (Sandbox Code Playgroud)

我想传递此命名空间的值(除外message_type)以创建该类的实例M.我试过了

M(args)
Run Code Online (Sandbox Code Playgroud)

但是得到了一个错误

TypeError: __init__() takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)

我不明白.我怎么能够

  1. message_type从中删除列表中的值args
  2. 传递值,就像我M(value=5, message='test', extra="blah", param="whatever")直接输入一样.

python arguments python-2.7 argparse

27
推荐指数
1
解决办法
9200
查看次数

处理argparse输入中的空格

使用python和argparse,用户可以使用-d作为标志输入文件名.

parser.add_argument("-d", "--dmp", default=None)
Run Code Online (Sandbox Code Playgroud)

但是,当路径包含空格时,这会失败.例如

-d C:\SMTHNG\Name with spaces\MORE\file.csv
Run Code Online (Sandbox Code Playgroud)

注意:空格会导致错误(标志只接受'C:SMTHNG\Name'作为输入).

error: unrecognized arguments: with spaces\MORE\file.csv
Run Code Online (Sandbox Code Playgroud)

花了我更长的时间来找到这个问题的解决方案......(没找到它的问答所以我自己发帖子)

python user-input spaces command-line-arguments argparse

27
推荐指数
3
解决办法
3万
查看次数

Python:argparse.Namespace对象的Typehints

有没有办法让Python静态分析器(例如在PyCharm,其他IDE中)接受argparse.Namespace对象上的Typehints ?例:

parser = argparse.ArgumentParser()
parser.add_argument('--somearg')
parsed = parser.parse_args(['--somearg','someval'])  # type: argparse.Namespace
the_arg = parsed.somearg  # <- Pycharm complains that parsed object has no attribute 'somearg'
Run Code Online (Sandbox Code Playgroud)

如果我删除内联注释中的类型声明,PyCharm不会抱怨,但它也不会选择无效的属性.例如:

parser = argparse.ArgumentParser()
parser.add_argument('--somearg')
parsed = parser.parse_args(['--somearg','someval'])  # no typehint
the_arg = parsed.somaerg   # <- typo in attribute, but no complaint in PyCharm.  Raises AttributeError when executed.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?


更新

奥斯汀在下面的回答的启发,我能找到的最简单的解决方案是namedtuples:

from collections import namedtuple
ArgNamespace = namedtuple('ArgNamespace', ['some_arg', 'another_arg'])

parser = argparse.ArgumentParser()
parser.add_argument('--some-arg')
parser.add_argument('--another-arg')
parsed …
Run Code Online (Sandbox Code Playgroud)

python type-hinting pycharm argparse python-3.x

27
推荐指数
4
解决办法
3157
查看次数