在Python中,我如何解析命令行,编辑生成的解析参数对象并使用更新的值生成有效的命令行?
例如,我希望python cmd.py --foo=bar --step=0
使用所有原始python cmd.py --foo=bar --step=1
参数调用--foo=bar
,在使用默认值时可能不会添加额外的参数。
是否可以使用argparse
?
答案 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
然后检查argv
和parser = 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