使用 Python 解析参数

像专业人士一样使用 argparse 模块解析 Python。
130 位读者喜欢这篇文章。
What to like about COBOL

Rainer Gerhards。由 Opensource.com 修改。CC BY-SA 4.0

如果您使用 Python 进行任何数量的开发,您可能已经在终端中发出过命令,即使只是启动 Python 脚本或使用 pip 安装 Python 模块也是如此。命令可能很简单且是单数的

$ ls

命令也可能带有参数

$ ls example

命令也可以有选项或标志

$ ls --color example

有时选项也带有参数

$ sudo firewall-cmd  --list-all --zone home

参数

POSIX shell 会自动将您键入的任何内容作为命令拆分为一个数组。例如,这是一个简单的命令

$ ls example

命令 ls 位于位置 $0,参数 example 位于位置 $1

可以编写一个循环来迭代每个项目;确定它是命令、选项还是参数;并采取相应的操作。幸运的是,一个名为 argparse 的模块已经存在用于此目的。

Argparse

argparse 模块很容易集成到您的 Python 程序中,并且具有多个便利功能。例如,如果您的用户更改选项的顺序,或者使用一个不带参数的选项(称为布尔值,意味着该选项打开或关闭设置),然后使用另一个需要参数的选项(例如 --color red),argparse 可以处理各种情况。如果您的用户忘记了必需的选项,argparse 模块可以提供友好的错误消息。

在您的应用程序中使用 argparse 首先要定义您想要为用户提供的选项。您可以接受几种不同类型的参数,但语法是一致且简单的。

这是一个简单的例子

#!/usr/bin/env python
import argparse
import sys

def getOptions(args=sys.argv[1:]):
    parser = argparse.ArgumentParser(description="Parses command.")
    parser.add_argument("-i", "--input", help="Your input file.")
    parser.add_argument("-o", "--output", help="Your destination output file.")
    parser.add_argument("-n", "--number", type=int, help="A number.")
    parser.add_argument("-v", "--verbose",dest='verbose',action='store_true', help="Verbose mode.")
    options = parser.parse_args(args)
    return options

此代码示例创建了一个名为 getOptions 的函数,并告诉 Python 查看每个以某些可识别的字符串(例如 --input-i)开头的潜在参数。Python 找到的任何选项都作为 options 对象从函数中返回(options 是一个任意名称,没有特殊含义;它只是一个数据对象,包含函数解析的所有参数的摘要)。

默认情况下,用户给出的任何参数都将被 Python 视为字符串。如果您需要摄取整数(数字),则必须指定选项期望 type=int,如示例代码中的 --number 选项所示。

如果您有一个仅打开或关闭功能的参数,则必须使用 boolean 类型,如示例代码中的 --verbose 标志所示。这种风格的选项只是存储 TrueFalse,指定用户是否使用了该标志。如果使用了该选项,则 stored_true 将被激活。

一旦 getOptions 函数运行,您就可以使用 options 对象的内容,并让您的程序根据用户如何调用命令来做出决策。您可以使用测试打印语句查看 options 的内容。将其添加到您的示例文件的底部

print(getOptions())

然后使用一些参数运行代码

$ python3 ./example.py -i foo -n 4
Namespace(input='foo', number=4, output=None, verbose=False)

检索值

示例代码中的 options 对象在以长选项命名的键中包含用户提供的任何值(或派生的布尔值)。例如,在示例代码中,可以通过查看 options.number 来检索 --number 选项。

options = getOptions(sys.argv[1:])

if options.verbose: 
    print("Verbose mode on")
else:
    print("Verbose mode off")

print(options.input)
print(options.output)
print(options.number)

# Insert Useful Python Code Here...

布尔选项 --verbose 在示例中通过测试 options.verbose 是 True(意味着用户确实使用了 --verbose 标志)还是 False(用户没有使用 --verbose 标志)来确定,并采取相应的操作。

帮助和反馈

Argparse 还包括一个内置的 --help(简写为 -h)选项,该选项提供了有关如何使用命令的有用提示。这是从您的代码派生的,因此生成此帮助系统不需要额外的工作

$ ./example.py --help
usage: example.py [-h] [-i INPUT] [-o OUTPUT] [-n NUMBER] [-v]

Parses command.

optional arguments:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        Your input file.
  -o OUTPUT, --output OUTPUT
                        Your destination output file.
  -n NUMBER, --number NUMBER
                        A number.
  -v, --verbose         Verbose mode.

像专业人士一样解析 Python

这是一个简单的示例,演示了如何在 Python 应用程序中处理解析参数以及如何快速有效地记录其语法。下次您编写快速 Python 脚本时,请使用 argparse 为其提供一些选项。稍后您会感谢自己的,并且您的命令将感觉不像是一个快速的 hack,而更像是一个“真正的”Unix 命令!

这是示例代码,您可以将其用于测试


#!/usr/bin/env python3
# GNU All-Permissive License
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.  This file is offered as-is,
# without any warranty.

import argparse
import sys

def getOptions(args=sys.argv[1:]):
    parser = argparse.ArgumentParser(description="Parses command.")
    parser.add_argument("-i", "--input", help="Your input file.")
    parser.add_argument("-o", "--output", help="Your destination output file.")
    parser.add_argument("-n", "--number", type=int, help="A number.")
    parser.add_argument("-v", "--verbose",dest='verbose',action='store_true', help="Verbose mode.")
    options = parser.parse_args(args)
    return options

options = getOptions(sys.argv[1:])

if options.verbose: 
    print("Verbose mode on")
else:
    print("Verbose mode off")

print(options.input)
print(options.output)
print(options.number)

 

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

4 条评论

我会使用来自 docopt.org 的 docopt
它解析您无论如何都必须编写的帮助信息,以处理选项。它也适用于多种语言。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.