最近,我正在学习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 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)
我在这里错过了什么吗?或者我可以没有指定选项的默认值吗?
我有一个小问题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)
虽然我可以通过这种方式使用它,但我真的宁愿能够使用科学记数法.有人有主意吗?
干杯
我正在使用argparse接受命令行输入并生成帮助文本.我想用ArgumentDefaultsHelpFormatter的formatter_class,但是这防止我也用 RawDescriptionHelpFormatter这将让我的自定义格式添加到我的描述或收尾.
除了自己编写代码以生成默认值的文本之外,还有一种明智的方法可以实现这一目的吗?根据argparse文档,所有内部ArgumentParser都被认为是实现细节,而不是公共API,因此子类化不是一个有吸引力的选择.
我的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的新手,现在正在使用它.我有一个脚本,它可以对设备执行一些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包,并使用Sphinx来创建文档.除了我的包代码,我还包括很多使用argparse的命令行Python脚本.我想知道是否有办法让Sphinx自动记录这些脚本?最终目标将是一个漂亮的脚本列表,以及相关的帮助打印,参数和选项.要清楚,我正在寻找一种预先存在的方法来做到这一点,而不是自己实现这一点的方法.
这并不像我通常所问的那样具体,如果有更合适的SE网站发布这个问题,请告诉我.谢谢.
我有一个类定义如下
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)
我不明白.我怎么能够
message_type从中删除列表中的值argsM(value=5, message='test', extra="blah", param="whatever")直接输入一样.使用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静态分析器(例如在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) argparse ×10
python ×10
python-3.x ×2
arguments ×1
pycharm ×1
python-2.7 ×1
spaces ×1
type-hinting ×1
user-input ×1