Python中的任意命令行参数

4 投票
3 回答
1747 浏览
提问于 2025-04-16 01:59

我想让用户可以随意输入命令行参数。如果用户输入的命令行看起来像这样:

myscript.py --a valueofa --b valueofb posarg1 posarg2

那么我就知道,a 是和 valueofa 一起传入的,b 是和 valueofb 一起传入的,还有这最后两个位置参数。

我以前一直使用 optparse,这个工具需要你明确指定要查找哪些参数。但是我希望用户能够在命令行中定义任意的“宏”。肯定有一个 Python 模块能比我自己写的更优雅地实现这个功能。那是什么呢?

3 个回答

0

你想知道 argparse 能否满足你的需求吗?它最近被加入到了标准库中。特别是,你可能想看看文档中的 这一部分

4

arbitrary_args.py:

#!/usr/bin/env python3

import sys


def parse_args_any(args):
    pos = []
    named = {}
    key = None
    for arg in args:
        if key:
            if arg.startswith('--'):
                named[key] = True
                key = arg[2:]
            else:
                named[key] = arg
                key = None
        elif arg.startswith('--'):
            key = arg[2:]
        else:
            pos.append(arg)
    if key:
        named[key] = True
    return (pos, named)


def main(argv):
    print(parse_args_any(argv))


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

$./arbitrary_args.py cmd posarg1 posarg2 --foo --bar baz posarg3 --quux:

(['cmd', 'posarg1', 'posarg2', 'posarg3'], {'foo': True, 'bar': 'baz', 'quux': True})

argparse_arbitrary.py:

#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-D', action='append', )
D = {L[0]:L[1] for L in [s.split('=') for s in parser.parse_args().D]}
print(D)

$./argparse_arbitrary.py -Ddrink=coffee -Dsnack=peanut

{'snack': 'peanut', 'drink': 'coffee'}

2

很遗憾,你无法做到。如果你必须支持这个功能,那就需要自己写一个选项解析器了 =(。

撰写回答