【问题标题】:Arbitrary command line arguments in pythonpython中的任意命令行参数
【发布时间】:2015-10-06 18:35:24
【问题描述】:

我想允许任意命令行参数。如果用户向我提供了如下所示的命令行

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

我知道avalueofa 一起传递,bvalueofb 一起传递,并且我有这最后两个位置参数。

我一直使用 optparse,您可以准确地指定要查找的参数。但我希望用户能够从命令行定义任意“宏”。肯定有一个 python 模块比我写的任何东西都更优雅。是什么?

【问题讨论】:

  • 我想到的类比是使用像-Dthismacro=macrovalue这样的gcc

标签: python command-line-arguments


【解决方案1】:

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': '花生', 'drink': '咖啡'}

【讨论】:

  • 我觉得应该选这个作为最佳答案。
【解决方案2】:

可悲的是,你 can't。如果您必须支持这一点,则需要编写自己的选项解析器 =(.

【讨论】:

    【解决方案3】:

    argparse 会做你想做的事吗?它最近被添加到标准库中。具体来说,您可能想查看文档中的this section

    【讨论】:

    • 我认为不会:“只要用户明显犯了错误,parse_args 方法就会尝试给出错误”意味着未定义的参数会导致错误。事实上,我认为这是故意的行为——你不经常想要允许,例如拼写错误。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 2018-12-17
    • 2012-02-20
    • 2021-12-26
    • 2019-08-05
    • 2015-08-09
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多