argparse - 构建命令行

Lit*_*thy 9 python argparse

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

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

有可能argparse吗?

Ben*_*res 6

您可以使用它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)
Run Code Online (Sandbox Code Playgroud)

将打印所需的命令行:

python cmd.py --foo=bar --step=1
Run Code Online (Sandbox Code Playgroud)


Tor*_*xed 0

据我所知,这是不可能的,但我也从来不需要这样做。

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

python test.py cmd --foo=bar --step=0
Run Code Online (Sandbox Code Playgroud)

而你能做的就是:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,这是非常具体的--step,并且可能是您已经想到的并且只是想要一种“更好的方法”,但同样,我认为不存在。