读取命名命令参数

我是否可以使用 argparse读取不需要按特定顺序的命令行参数?我浏览了 文件,但大部分内容都是基于提供的参数(比如 --h)来显示内容。

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

Myscript. py foo-val bar-val

使用 sys.argv:

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

但是我想改变输入,通过命名参数使其不可知次序:

Py —— bar = bar-val —— foo = foo-val

51684 次浏览

答案是 是的。快速浏览一下 Arparse 文档也会得到同样的答案。

下面是一个非常简单的示例,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

通过阅读文档,您将发现许多其他特性;)

你可以像这样使用 可选论点

通过这个节目:

#!/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日: Python 更新这个答案..。

我觉得这可能会帮你解决一个简单的问题

#! /usr/bin/python3
import sys
                                                                                                                                   

keys = ["--paramkey=","-p="]
for i in range(1,len(sys.argv)):
for key in keys:
if sys.argv[i].find(key) == 0:
print(f"The Given value is: {sys.argv[i][len(key):]}")
break

跑步:

$ ./example.py --paramkey=paramvalue -p=pvalue

产出:

The Given value is: paramvalue
The Given value is: pvalue