【问题标题】:Python argparse has a bug (?) with single character options argumentsPython argparse 有一个带有单字符选项参数的错误(?)
【发布时间】:2017-07-29 22:26:25
【问题描述】:

我有这段代码解析命令行参数:

def handleCmdLineArgs(self):
    parser = argparse.ArgumentParser()
    parser.add_argument('-j','--juice', help='juice', default="")
    parser.add_argument('-bx','--box', help='box', default="")
    args,unknown = parser.parse_known_args()

当我使用以 j argparse 开头的参数运行命令行时,-j 参数 argparse 将用单词的其余部分替换 -j 参数:

示例: program.py -j 橙色-丛林

argparse 将返回 args.juice = "ungle" 而不是所需的 "orange"

我已经创建了一个解决方法,但我很好奇是否有其他人看到过这个或知道它发生的原因?或者这可能是 argparse 中的错误?

【问题讨论】:

    标签: python command-line argparse


    【解决方案1】:

    这是预期的行为。对于单破折号选项,空格是可选的。所以这两个是等价的:

    program.py -jorange
    program.py -j orange
    

    查看文档的Option value syntax section

    对于短选项(选项只有一个字符长),选项及其值可以连接:

    >>> parser.parse_args(['-xX'])
    Namespace(foo=None, x='X')
    

    如果你想传入orange -jungle作为值,你需要在命令行中使用引号:

    program.py -j "orange -jungle"
    

    如果您想传入恰好以- 开头的其他位置参数,请使用-- 来表示选项标志的结束:

    program.py -j orange -- -jungle
    

    Arguments containing - section

    如果您有必须以- 开头的位置参数并且看起来不像负数,则可以插入伪参数'--',它告诉parse_args() 之后的所有内容都是位置参数:

    >>> parser.parse_args(['--', '-f'])
    Namespace(foo='-f', one=None)
    

    【讨论】:

    • 我不想传入橙色 -jungle 作为值,我想传入橙色作为 -j 的值,我希望 -jungle 以未知结尾
    • @Ken:这不是一个可用的选项。命令行应该接受一个选项,或者如果不能接受则引发错误。您也许可以尝试 partial parsing 来实现处理“未知”选项,但对于以已知单字符短选项开头的任何值,您必须接受 argparse 将其视为选项值对。
    • @Martijn Pieters,这正是我正在做的。注意这一行:args,unknown = parser.parse_known_args()
    • 正如我所说,但对于以已知单字符短选项开头的任何值,您必须接受 argparse 将其视为选项值对。你可以试试click,它显然对选项解析做了更少的假设,看看它是否不把-j...当作一个开关。
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 2013-07-06
    • 2016-08-11
    • 2017-03-12
    • 1970-01-01
    • 2020-05-04
    • 2011-09-17
    • 2012-10-01
    相关资源
    最近更新 更多