【问题标题】:argparse: require optional arguments to precede positional arguments [duplicate]argparse:需要可选参数在位置参数之前[重复]
【发布时间】:2016-05-06 02:00:52
【问题描述】:

我有一个包装 openssh 客户端二进制文件的 Python 脚本,并且需要以相同的方式解析参数。我正在使用 argparse。

使用 ssh,这意味着连接到主机,以“a”身份登录,然后运行“ls”。

ssh -la host ls

虽然这意味着连接到主机并运行“ls -la”:

ssh host ls -la

argparse 将这些视为相同。有没有一种惯用的方式告诉 argparse 可选参数必须在位置参数之前?

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    使用nargs=argparse.REMAINDER:

    import argparse
    
    p = argparse.ArgumentParser()
    p.add_argument('-l', '--login')
    p.add_argument('host')
    p.add_argument('cmd', nargs=argparse.REMAINDER)
    print p.parse_args('-la server ls'.split())
    print p.parse_args('server ls -la'.split())
    

    结果:

    Namespace(cmd=['ls'], host='server', login='a')
    Namespace(cmd=['ls', '-la'], host='server', login=None)
    

    【讨论】:

      【解决方案2】:

      我认为您尝试完成的工作非常适合 argparse 子命令概念。看看吧:https://docs.python.org/3/library/argparse.html#sub-commands

      【讨论】:

      • "host" 在这里不是一个固定值,它是一个位置参数,可以有任何值。移交给子解析器必须在第一个位置参数之后发生,而不是在特定命令之后。我没有办法做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2011-05-27
      • 2023-04-02
      • 2018-12-22
      • 2018-02-20
      相关资源
      最近更新 更多