Python教程-Python 命令行参数
Python支持可以在命令行上运行并带有命令行参数的程序。命令行参数是在执行脚本时需要传递给脚本的输入参数。
这意味着可以与脚本的命令行界面进行交互。
它提供了一个 getopt 模块,可以用于解析命令行参数和选项。
什么是参数传递?
命令 ls 经常用于获取特定目录中存在的文件和文件夹的摘要。
为什么使用 argparse?
这是一种不需要进入代码并对脚本进行更改就可以在程序编写者和用户之间进行通信的方法。它为用户提供了在命令行中输入选项的能力。
访问命令行参数
Python 的 sys 模块通过 sys.argv 提供对命令行参数的访问。它解决了两个目的:
Python sys 模块
这是一个基本模块,早期已随 Python 分发。它使用与 C 库类似的方法,使用 argc/argv 来访问参数。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 提供了一个带有标准输出的命令行界面,而前两种解决方案则需要您完成大部分工作。argparse 允许对固定和可选的参数进行验证,并将名称检查为 UNIX 或 GNU 样式。这是解析命令行参数的首选方法。它提供了许多选项,如位置参数、参数的默认值、帮助消息、指定参数的数据类型等。
它使得编写用户友好的命令行界面变得容易。它自动生成帮助和使用消息,并在用户给程序提供无效参数时报错。
getopt.getopt 方法
该方法用于解析命令行选项和参数列表。
语法:
getopt.getopt(args, options, [long_options])
args - 要解析的参数列表。
options - 包含脚本希望识别的选项字母的字符串,需要参数的选项应该在冒号(:)后面跟随。
long_options(可选) - 必须是一个字符串,包含要支持的长选项的名称。
- 此方法返回一个值,由两个元素组成,即 (option, value) 对的列表,剥离选项列表后的程序参数列表。
- 每个选项和值对都作为其第一个元素返回,短选项(例如,'-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