一. 简介
我们在使用脚本形式执行 Python 时,可以接收命令行输入的参数。
本文来学习 python3的命令行参数。
二. python3的基本语法:命令行参数
1. python命令行参数
Python 提供了 getopt 模块来获取命令行参数。
Python 中也可以所用 sys 的 sys.argv 来获取命令行参数:
-
sys.argv 是命令行参数列表。
-
len(sys.argv) 计算命令行参数个数。
注意:sys.argv[0] 表示脚本名。
实例如下:
#!/usr/bin/python3
import sys
print ('参数个数为:', len(sys.argv))
print ('参数列表:', str(sys.argv))
print ('脚本名:', str(sys.argv[0]))
在 ubuntu系统下运行,执行以上代码,输出结果为:
$ python3 test.py arg1 arg2 arg3
参数个数为: 4 个参数。
参数列表: ['test.py', 'arg1', 'arg2', 'arg3']
脚本名: test.py
2. getopt 模块
getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是 sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式 - 和长选项模式 --。
getopt 模块提供了两个方法及一个异常处理来解析命令行参数。
getopt.getopt 方法
getopt.getopt 方法用于解析命令行参数列表,语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明:
-
args: 要解析的命令行参数列表。
-
options: 以字符串的格式定义,options 后的冒号 : 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。
-
long_options: 以列表的格式定义,long_options 后的等号 = 表示如果设置该选项,必须有附加的参数,否则就不附加参数。
getopt 该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有 - 或 -- 的参数。
- opts:是有一个列表,列表里是元组(opt, value)的格式。比如上面的 "-h -i inputfile -o outputfile" 那就是 [('-h', ''), ('-i', 'inputfile'), ('-o', 'outputfile')] 这样的返回值。长选项和短选项以及各自的参数都会按先后次序放在这里。用的时候可以以 for opt,val in opts: 这样的方式来遍历。值得注意的是,返回的 opt 里面,'-' 和 '--' 都被保留下来了,另外,当用户输入的长选项没有写完的时候,会被自动补全。比如用户输入的是 --u,通过 getopt 会被自动补全成 --user,这个需要注意(除非有两个长选项都有相同的开头,无法确定是哪个)。
- args:如果用户输入的信息太多,除了长选项和短选项以及各自选项的参数以外,还有一些其它的未知的参数,则会被放到这里。
接下来我们定义一个 site() 函数,然后通过命令行输入站点名称 name 和网址 url,可以用缩写 n 和 u:
import sys
import getopt
def size():
name = None
url = None
argv = sys.argv[1:]
try:
opts, args = getopt.getopt(argv, "n:u:") # 短选项模式
except:
print("Error")
for opt, arg in opts:
if opt in ['-n']:
name = arg
elif opt in ['-u']:
url = arg
print("name" +' ' + url)
size()
这里的 python文件为 test.py。测试以上代码,命令行中输入:
python3 test.py -n baidu -u www.baidu.com
输出结果为:
以下实例演示长选项模式的使用,test.py 代码如下:
import sys
import getopt
def site():
name = None
url = None
argvs = sys.argv[1:]
try:
opts, args = getopt.getopt(argvs, "n:u:",
["name=",
"url="]) # 长选项模式
except:
print("Error")
for opt, arg in opts:
if opt in ['-n', '--name']:
name = arg
elif opt in ['-n', '--url']:
url = arg
print( name + " " + url)
site()
测试以上代码,命令行中输入:
python3 test.py --name baidu --url www.baidu.com
输出结果为:
aidu www.baidu.com
另外一个方法是 getopt.gnu_getopt,用到的情况比较少,这里不多做介绍。