读取命名命令参数

Posted

技术标签:

【中文标题】读取命名命令参数【英文标题】:Reading named command arguments 【发布时间】:2017-02-21 10:47:37 【问题描述】:

我可以使用argparse 来读取不需要按特定顺序排列的命名命令行参数吗?我浏览了documentation,但大部分都集中在根据提供的参数显示内容(例如--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

【问题讨论】:

找不到好的副本,但请在此处查看一些示例:***.com/questions/11415570/… 【参考方案1】:

答案是是的。快速浏览一下the argparse documentation 也会有答案。

这是一个非常简单的例子,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 值传递的 args = parser.parse_args("--foo pouet".split()) 行中,为什么要硬编码脚本应该读取的参数值而不是读取命令提供的任何值? @amphibient 这是一个向您展示如何访问参数值的示例。在真正的脚本中,您只需调用 parser.parse_args() 而不使用任何参数,它将采用 sys.args 列表【参考方案2】:

您可以像这样使用Optional Arguments:

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 args
print sys

然后,如果您使用 ./prog --bar=bar-val --foo foo-val 调用它,它会打印:

Namespace(bar='bar-val', foo='foo-val')
['Untitled 14.py', '--bar=bar-val', '--foo', 'foo-val']

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

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

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

【讨论】:

args 加载后如何读取foo 的值? args.get('foo')这样的吗? 使用args.bar 读取--bar 如果未包含在命令中,它将返回None。您也可以使用默认值。 使用python 3.5.1,不包含时不返回None;它给出了一个错误。因此,作为替代方案,d = vars(args) 提供了一个字典(将命名参数映射到值) @MikhailV:只是为了显示在处理之前命令行上的内容,最后使用 print sys【参考方案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 

【讨论】:

以上是关于读取命名命令参数的主要内容,如果未能解决你的问题,请参考以下文章

Python argparse:可以命名或定位的命令行参数

[Asp.Net Core] 命令行参数读取+配置多种读取

[Asp.Net Core] 命令行参数读取+配置多种读取

高手求教!!!c语言中怎样读取命令行参数?

读取 LOLCODE 中的命令行参数

如何读取提供给卸载程序的命令行参数?