Python命令行参数
Python支持在命令行上运行的程序,包括命令行参数。在执行脚本时,需要传递输入参数。
这意味着与脚本的命令行界面进行交互。
它提供了一个 getopt 模块,可以解析命令行参数和选项。
什么是参数传递
命令行上经常使用 ls 命令来获得特定目录中文件和文件夹的概要。
为什么要使用argparse
它意味着在程序编写人员和用户之间进行通信,而不需要进入代码并对脚本进行更改。它提供了让用户输入命令行参数的能力。
访问命令行参数
Python的sys模块通过sys.argv提供对命令行参数的访问。它解决了两个目的:
Python sys模块
它是一个基本的模块,从Python发行版的早期就包含在内。它是使用argc/argv来访问参数的类似于C库的方法。sys模块使用名为sys.argv的简单列表结构实现了命令行参数。
每个列表元素表示一个单独的参数。第一个参数是sys.argv[0],即Python脚本的名称。其他列表元素是sys.argv[1]到sys.argv[n],它们是命令行参数2到n。作为参数之间的分隔符,使用空格。包含空格的参数值必须用引号括起来。
它将命令行参数存储在一个列表中,我们可以使用sys.argv来访问它。这是一种非常有用且简单的方式来读取命令行参数作为字符串。
import sys
print(type(sys.argv))
print('The command line arguments are:')
for i in sys.argv:
print(i)
Python getopt模块
Python getopt模块扩展了通过参数验证对输入字符串的分离。基于C函数getopt,它允许使用短选项和长选项,并包括值的赋值。
它与C getopt()函数非常相似,用于解析命令行参数。
在解析命令行参数时,它对于希望用户输入某些选项非常有用。
代码
import getopt
import sys
argv = sys.argv[1:]
try:
opts, args = getopt.getopt(argv, 'hm:d', ['help', 'my_file='])
print(opts)
print(args)
except getopt.GetoptError:
# Print a message or do something useful
print('Something went wrong!')
sys.exit(2)
Python argparse模块
它提供了一个带有标准输出的命令行界面,而前两种解决方案则需要你自己完成大部分工作。argparse允许使用名称检查来验证固定和可选参数,可以选择UNIX或GNU风格。它是解析命令行参数的首选方法。它提供了许多选项,如位置参数、参数的默认值、帮助消息、指定参数数据类型等。
它使编写用户友好的命令行界面变得容易。它会自动生成帮助和使用消息,并在用户给程序提供无效参数时发出错误。
getopt.getopt方法
此方法用于解析命令行选项和参数列表。
语法:
getopt.getopt(args, options, [long_options])
args - 需要解析的参数列表。
options - 字符串形式的选项字母,脚本希望识别的选项,其中需要一个参数的选项应该在冒号(:)后面提供参数。
long_options(可选) - 必须是一个字符串,包含应该支持的长选项的名称。
- 该方法返回由两个元素组成的值,即列表 ( 选项,值 ) 对,以及在剥离选项列表后剩下的程序参数的列表。
- 每个选项和值对作为一个选项返回,短选项前面带有连字符(例如,’-x’),长选项前面带有两个连字符(例如,’–long-option’)。
异常 getopt.GetoptError
当在参数列表中发现无法识别的选项或给出了需要参数的任何选项时,会引发此异常。
该异常的参数是一个字符串,指示错误的原因。属性 msg 和 opt 用于提供错误消息和相关选项。
代码
#!/usr/bin/python
import sys, getopt
def main(argv):
inputfile = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print 'test.py -i <inputfile> -o <outputfile>'
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print 'test.py -i <inputfile> -o <outputfile>'
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print 'Input file is "', inputfile
print 'Output file is "', outputfile
if __name__ == "__main__":
main(sys.argv[1:])
输出:
$ test.py -h
usage: test.py -i <inputfile> -o <outputfile>
$ test.py -i BMP -o
usage: test.py -i <inputfile> -o <outputfile>
$ test.py -i inputfile
Input file is " inputfile
Output file is "
如何在Python中使用命令行参数
模块 | 用法 | Python版本 |
---|---|---|
sys | 在sys.argv中获取所有的参数(基本) | 所有 |
argparse | 构建一个命令行界面 | >= 2.3 |
docopt | 创建命令行界面 | >= 2.5 |
fire | 自动生成命令行界面(CLIs) | 所有 |
optparse | 已被弃用 | < 2.7 |
Docopt
Docopt用于创建命令行界面。
from docopt import docopt
if __name__ == '__main__':
arguments = docopt(__doc__, version='Example 1')
print(arguments)
Fire
Python Fire可以自动生成命令行界面;只需一行代码即可。与其他模块不同,它能立即工作。
您无需定义任何参数;所有方法默认连接在一起。
安装它的方法如下:
pip install fire
定义或使用一个类:
import fire
class Python(object):
def hello(self):
print("Hello")
def openfile(self, filename):
print("Open file '" + filename + "'")
if __name__ == '__main__':
fire.Fire(Python)
您可以使用与类方法匹配的选项:
python example.py hello
python example.py openfile filename.txt