argparse - 构建命令行

时间:2015-11-18 08:55:24

标签: python argparse

在Python中,我如何解析命令行,编辑生成的解析参数对象并使用更新的值生成有效的命令行?

例如,我希望python cmd.py --foo=bar --step=0使用所有原始python cmd.py --foo=bar --step=1参数调用--foo=bar,在使用默认值时可能不会添加额外的参数。

是否可以使用argparse

4 个答案:

答案 0 :(得分:1)

ok: [default] => (item={'regexp': '^AcceptEnv\\s', 'line': 'AcceptEnv LANG LC_* P4* GIT_* HGUSER RD_*'}) => { "item": { "line": "AcceptEnv LANG LC_* P4* GIT_* HGUSER RD_*", "regexp": "^AcceptEnv\\s" }, "msg": "^AcceptEnv\\s=AcceptEnv LANG LC_* P4* GIT_* HGUSER RD_*" } 显然是设计为从SELECT DAYOFYEAR(dt) `day`, MIN(`value`) min_value, MAX(`value`) max_value FROM Table1 GROUP BY `day` ORDER BY `day` ASC argparse命名空间的一种方式。没有考虑过保留可以让你以其他方式映射事物的信息,更不用说映射本身了。

通常,多个sys.argv可以产生相同的args。例如,您可以使用具有相同sys.argv的多个参数。或者您可以重复'期权'。但对于受限制的解析器'设置可能有足够的信息来重新创建可用的args

尝试类似:

dest

然后检查argvparser = argparser.ArgumentParser() arg1 = parser.add_argument('--foo', default='default') arg2 = parser.add_argument('bar', nargs=2) 个对象。它们包含您提供给arg1方法的所有信息。当然,您可以事先在自己的数据结构中定义这些值,例如

arg2

并将其用作add_argument的输入。

虽然解析器可能有足够的信息来重新创建可用的{'option_string':'--foo', 'default':'default'} {'dest':'bar', 'nargs':2} ,但您必须自己弄清楚如何做到这一点。

add_argument可能很方便。它使解析器不会在命名空间中添加默认条目。因此,如果没有使用该选项,它就不会出现在命名空间中。

答案 1 :(得分:0)

这不可能以我所知的任何简单方式实现,然后我再也不需要这样做了。

但由于问题中缺少关于如何调用脚本的信息,我将假设以下内容:

python test.py cmd --foo=bar --step=0

你可以做的是:

from sys import argv
for index in range(1, len(argv)): # the first object is the script itself
    if '=' in argv[index]:
        param, value = argv[index].split('=', 1)
        if param == '--step':
            value = '1'
        argv[index] = param + '=' + value

print(argv)

请注意,这是--step非常具体的,可能是您已经想到的,只是想要一个更好的方式"但是,我不会这样做认为有。

答案 2 :(得分:0)

取决于范围,这至少在相同的模块上起作用:

pprint(argparse._sys.argv)

答案 3 :(得分:-1)

您可以使用argparse来解析命令行参数,然后根据需要修改它们。但是,argparse目前缺乏反向工作并将这些值转换回命令行字符串的功能。但是,有一个用于精确执行此操作的程序包,称为argunparse。例如,cmd.py

中的以下代码
import sys
import argparse
import argunparse

parser = argparse.ArgumentParser()
unparser = argunparse.ArgumentUnparser()
parser.add_argument('--foo')
parser.add_argument('--step', type=int)

kwargs = vars(parser.parse_args())
kwargs['step'] += 1
prefix = f'python {sys.argv[0]} '
arg_string = unparser.unparse(**kwargs)
print(prefix + arg_string)

将打印所需的命令行:

python cmd.py --foo=bar --step=1