读取命名的命令行参数

78
我可以使用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


找不到好的重复项,但在这里检查一些示例:https://dev59.com/2Wgu5IYBdhLWcg3wUlft - Jean-François Fabre
3个回答

126

你可以使用可选参数,如下所示。

使用此程序:

#!/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...


2
在加载参数后,我如何读取 foo 的值? - amphibient
1
有没有类似于 args.get('foo') 的东西? - amphibient
10
使用args.bar读取--bar,如果命令中没有包含则会返回None。您还可以使用默认值。 - dawg
1
使用Python 3.5.1版本,如果未包含则不会返回“None”,而是会出现错误。因此,作为替代方案,“d = vars(args)”会提供一个字典(将命名参数映射到值)。 - DZack
@MikhailV:只是为了展示在处理结束前命令行上的内容,最后使用print sys - dawg
@dawg 哦,好的。在Python 3中它不起作用。使用print(sys.argv)可以解决问题。 - Mikhail V

40
答案是:

答案是。如果仔细查看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

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


但在您的脚本中,您不知道'pouet'被传递为arg值。 - amphibient
在代码行 args = parser.parse_args("--foo pouet".split()) 中,为什么要硬编码指定脚本应该读取什么参数值,而不是读取命令提供的任何值? - amphibient
1
@amphibient 这是一个示例,向您展示如何访问参数值。在实际脚本中,您只需调用 parser.parse_args() 而不带任何参数,它将获取 sys.args 列表。 - Tryph

3
我认为这可能会对您有所帮助,这是一个简单的例子。
#! /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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接