【问题标题】:Python argparse command line flags without arguments没有参数的 Python argparse 命令行标志
【发布时间】:2012-01-05 17:41:53
【问题描述】:

如何在命令行参数中添加可选标志?

例如。所以我可以写

python myprog.py 

python myprog.py -w

我试过了

parser.add_argument('-w')

但我只是收到一条错误消息说

Usage [-w W]
error: argument -w: expected one argument

我认为这意味着它需要 -w 选项的参数值。只接受一面旗帜的方式是什么?

我发现http://docs.python.org/library/argparse.html 在这个问题上相当不透明。

【问题讨论】:

  • 如果您只希望在脚本中添加 1 个标志,那么 sys.argv 会容易得多。除非你特别想学习 argparse,这很好,因为它是一个方便的模块。
  • 即使我现在知道了答案,我也看不出我怎么能从文档中理解它。

标签: python command-line-arguments argparse


【解决方案1】:

如您所见,参数w 期望在命令行上-w 之后有一个值。如果您只是想通过设置变量 TrueFalse 来翻转开关,请查看 here(特别是 store_true 和 store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

其中action='store_true' 暗示default=False

相反,你可以有action='store_false',这意味着default=True

【讨论】:

  • @Jdog,知道为什么这对我不起作用吗? w 始终为 False
  • 对我来说我总是正确的
【解决方案2】:

添加一个快速的 sn-p 使其准备好执行:

来源:myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

用法:

python myparser.py -w
>> True

【讨论】:

    【解决方案3】:

    您的脚本是正确的。但默认情况下是 None 类型。所以它认为除了 None 之外的任何其他值都是 true 分配给 args.argument_name 变量。

    我建议您添加一个 action="store_true"。这将使真/假类型的标志。 If used its True else False.

    import argparse
    parser = argparse.ArgumentParser('parser-name')
    parser.add_argument("-f","--flag",action="store_true",help="just a flag argument")
    

    用法

    $ python3 script.py -f
    

    使用 args.f 检查解析后返回 true,

    args = parser.parse_args()
    print(args.f)
    
    >>>true
    

    【讨论】:

      【解决方案4】:

      这是一个快速的方法,除了sys之外不需要任何东西。虽然功能有限:

      flag = "--flag" in sys.argv[1:]

      [1:] 以防万一完整文件名是--flag

      【讨论】:

      • 刚刚登录只是为了表达从长远来看这是一个多么糟糕的想法。想象一下,您首先检查字符串“--flag”是否在 sys.argv 中。然后查看 sys.argv[-1] 的末尾,看看要打开哪个文件。突然之间,您会遇到这样一种情况,如果您尝试打开一个名为 --flag 的文件,那么它的行为会出乎意料,更糟糕的是,当数据不受信任时,这通常会成为未来的安全漏洞最终被传递给 argv。最后,这种方法不应该做。真正的 arg 解析器更加健壮...
      • 如前所述,此解决方案根本不可靠,但如果您需要快速完成此操作(例如用于测试目的),它可以工作。绝对让它远离生产代码。
      猜你喜欢
      • 2017-12-25
      • 2020-05-04
      • 2014-07-09
      • 2018-01-25
      • 2012-10-25
      • 2012-03-19
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多