使用argparse保持参数不变

12 投票
2 回答
3637 浏览
提问于 2025-04-17 12:03

我想用argparse这个工具来处理我知道的参数,然后把其他的参数不管。例如,我想运行

performance -o output other_script.py -a opt1 -b opt2

这个命令使用了-o这个选项,其他的参数就不动。

模块profiler.py用optparse做了类似的事情,但因为我在用argparse,所以我这样做:

def parse_arguments():
    parser = new_argument_parser('show the performance of the given run script')
    parser.add_argument('-o', '--output', default='profiled.prof')

    return parser.parse_known_args()

def main():
    progname = sys.argv[1]
    ns, other_args = parse_arguments()
    sys.argv[:] = other_args

这样也能工作,但如果另一个脚本other_script.py也有一个-o的选项,那会怎样呢?

总的来说,有没有更好的方法来解决这个问题呢?

2 个回答

20

你还可以给你的解析器添加一个位置参数,使用 nargs=argparse.REMAINDER,这样可以捕捉到脚本及其选项:

# In script 'performance'...
p = argparse.ArgumentParser()
p.add_argument("-o")
p.add_argument("command", nargs=argparse.REMAINDER)
args = p.parse_args()
print args

运行上面的这个简单脚本...

$ performance -o output other_script.py -a opt1 -b opt2
Namespace(command=['performance', '-a', 'opt1', '-b', 'opt2'], o='output')
8

argparse 是一个用来处理命令行参数的工具,它会一直解析参数,直到遇到文件结束符(EOF)或者双短横线(--)。如果你想要某些参数不被 argparse 处理,可以这样写:

python [PYTHONOPTS] yourfile.py [YOURFILEOPT] -- [ANYTHINGELSE]

撰写回答