Python argparse 不带参数的命令行标志

发布于 2024-12-18 00:58:41 字数 480 浏览 2 评论 0原文

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

例如。所以我可以写

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 在这个问题上相当不透明。

How do I add an optional flag to my command line args?

eg. so I can write

python myprog.py 

or

python myprog.py -w

I tried

parser.add_argument('-w')

But I just get an error message saying

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

which I take it means that it wants an argument value for the -w option. What's the way of just accepting a flag?

I'm finding http://docs.python.org/library/argparse.html rather opaque on this question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

简美 2024-12-25 00:58:41

正如您所看到的,参数 w 需要命令行上 -w 之后的值。如果您只是想通过设置变量 TrueFalse 来切换开关,请查看 此处(特别是 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

As you have it, the argument w is expecting a value after -w on the command line. If you are just looking to flip a switch by setting a variable True or False, have a look here (specifically store_true and store_false)

import argparse

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

where action='store_true' implies default=False.

Conversely, you could haveaction='store_false', which implies default=True.

满栀 2024-12-25 00:58:41

添加一个快速片段以使其准备好执行:

来源: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

Adding a quick snippet to have it ready to execute:

Source: 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

Usage:

python myparser.py -w
>> True
初见终念 2024-12-25 00:58:41

你的剧本是对的。但默认情况下是 None 类型。因此,除了 None 之外的任何其他值都被视为 true 被分配给 args.argument_name 变量。

我建议您添加一个 action="store_true"。这将形成 True/False 类型的标志。如果使用则为 True,否则为 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

Your script is right. But by default is of None type. So it considers true of any other value other than None is assigned to args.argument_name variable.

I would suggest you to add a action="store_true". This would make the True/False type of flag. 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")

usage

$ python3 script.py -f

After parsing when checked with args.f it returns true,

args = parser.parse_args()
print(args.f)
>>>true
人生百味 2024-12-25 00:58:41

如果您正在寻找二进制标志,则 argparse 操作 store_truestore_false 正是提供了这一点。 @Jdog 接受的答案很好地解释了这种方法。

官方文档也相当清楚。我只会用一行完成该示例,因此为了非常清楚 store_true/store_false 的作用:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--fov', action='store_true')  # this is not in the docs!
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())  # --baz and --fov are missing
Out[4]: Namespace(bar=False, baz=True, foo=True, fov=False)  # mind the fov=False

一种稍微更强大的方法是使用 <代码>计数操作。在运行命令时设置详细级别时,您通常已经使用了这种类型的标志。

例如,ssh 的详细模式标志 -v 是一个计数器:

-v 详细模式。使 ssh 打印有关其进度的调试消息。这有助于调试连接、身份验证和配置问题。 多个-v
选项增加了冗长性。最大值为 3。

因此,如果您运行 ssh ,它是非详细的,ssh -v 稍微详细,ssh -vvv 是极其冗长。

使用Python中的argparse,这样的计数器标志可以定义如下:

parser.add_argument('--verbose', '-v', action='count', default=0)

如果你想将它用作布尔值(True/False)标志,那么您需要将 args.verbose 转换为布尔值。您可以自己明确地执行此操作,也可以依赖条件语句,例如 if args.verbose: ...

这是一个完整的工作示例,说明如何使用计数器标志

使用脚本test.py

#!/usr/bin/env python3
# test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='count', default=0)
args = parser.parse_args()

if args.verbose:
    print('verbose')
    print(f'verbosity level: {args.verbose}')
else:
    print('non-verbose')

您将获得以下输出:

python test.py 
>> non-verbose 

python test.py -v
>> verbose
>> verbosity level: 1

python test.py -vvv
>> verbose
>> verbosity level: 3

If you are looking for a binary flag, then the argparse actions store_true or store_false provide exactly this. This approach is well explained in the accepted answer by @Jdog.

The official docs are also fairly clear. I would only complete the example with one line, so to make it very clear how the store_true/store_false act:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--fov', action='store_true')  # this is not in the docs!
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())  # --baz and --fov are missing
Out[4]: Namespace(bar=False, baz=True, foo=True, fov=False)  # mind the fov=False

A slightly more powerful approach is to use the count action. You typically have used this type of flag already when setting the verbosity level when running a command.

For example ssh's verbose mode flag -v is a counter:

-v Verbose mode. Causes ssh to print debugging messages about its progress. This is helpful in debugging connection, authentication, and configuration problems. Multiple -v
options increase the verbosity. The maximum is 3.

So if you run ssh it's non verbose, ssh -v is slightly verbose and ssh -vvv is maximally verbose.

With argparse in python such a counter flag can be defined as follows:

parser.add_argument('--verbose', '-v', action='count', default=0)

If you want to use it as a boolena (True/False) flag, then you need to cast args.verbose into a boolean. You can either do this explicitly yourself, or rely a conditional statement like if args.verbose: ....

Here is a full working example to illustrate how you can use the counter flag:

With the script test.py:

#!/usr/bin/env python3
# test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='count', default=0)
args = parser.parse_args()

if args.verbose:
    print('verbose')
    print(f'verbosity level: {args.verbose}')
else:
    print('non-verbose')

You get the following outputs:

python test.py 
>> non-verbose 

python test.py -v
>> verbose
>> verbosity level: 1

python test.py -vvv
>> verbose
>> verbosity level: 3
眉目亦如画i 2024-12-25 00:58:41

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

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

[1:] 是指完整文件名是 --flag

Here's a quick way to do it, won't require anything besides sys.. though functionality is limited:

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

[1:] is in case if the full file name is --flag

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文