如果您使用 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 标志所示。这种样式的选项只是存储 True 或 False,指定用户是否使用了该标志。如果使用了该选项,则 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)
4 条评论