读取命名命令参数

新手上路,请多包涵

我可以使用 argparse 来读取不需要按特定顺序排列的命名命令行参数吗?我浏览了 文档,但其中大部分都侧重于根据提供的参数显示内容(例如 --h )。

现在,我的脚本读取有序的、未命名的参数:

myscript.py foo-val bar-val

使用 sys.argv

 foo = sys.argv[1]
bar = sys.argv[2]

但我想通过命名参数更改输入,使其与顺序无关:

myscript.py –bar=bar-val –foo=foo-val

原文由 amphibient 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 451
2 个回答

您可以像这样使用 可选参数

有了这个程序:

 #!/usr/bin/env python3

import argparse, sys

parser=argparse.ArgumentParser()

parser.add_argument("--bar", help="Do the bar option")
parser.add_argument("--foo", help="Foo the program")

args=parser.parse_args()

print(f"Args: {args}\nCommand Line: {sys.argv}\nfoo: {args.foo}")
print(f"Dict format: {vars(args)}")

使其可执行:

 $ chmod +x prog.py

然后,如果你调用它:

 $ ./prog.py --bar=bar-val --foo foo-val

它打印:

 Args: Namespace(bar='bar-val', foo='foo-val')
Command Line: ['./prog.py', '--bar=bar-val', '--foo', 'foo-val']
foo: foo-val
Dict format: {'bar': 'bar-val', 'foo': 'foo-val'}

或者,如果用户需要帮助,argparse 也会构建它:

  $ ./prog.py -h
usage: prog.py [-h] [--bar BAR] [--foo FOO]

options:
  -h, --help  show this help message and exit
  --bar BAR   Do the bar option
  --foo FOO   Foo the program


2022-08-30:更新到 Python3 这个答案……

原文由 dawg 发布,翻译遵循 CC BY-SA 4.0 许可协议

答案是 肯定 的。快速浏览一下 argparse 文档 也会有答案。

这是一个非常简单的例子,argparse 能够处理更具体的需求。

 import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', '-f', help="a random options", type= str)
parser.add_argument('--bar', '-b', help="a more random option", type= int, default= 0)

print(parser.format_help())
# usage: test_args_4.py [-h] [--foo FOO] [--bar BAR]
#
# optional arguments:
#   -h, --help         show this help message and exit
#   --foo FOO, -f FOO  a random options
#   --bar BAR, -b BAR  a more random option

args = parser.parse_args("--foo pouet".split())
print(args)  # Namespace(bar=0, foo='pouet')
print(args.foo) # pouet
print(args.bar) # 0

当然,在真实脚本中,您不会对命令行选项进行硬编码,而是会调用 parser.parse_args() (不带参数)。它将使 argparse 将 sys.args 列表作为命令行参数。

您将能够以这种方式调用此脚本:

 test_args_4.py -h  # prints the help message
test_args_4.py -f pouet  # foo="pouet", bar=0 (default value)
test_args_4.py -b 42  # foo=None, bar=42
test_args_4.py -b 77 -f knock  # foo="knock", bar=77

通过阅读文档,您会发现很多其他功能;)

原文由 Tryph 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题