命令行参数会存放在 sys.argv
中, sys.argv 是一个 list。getopt 是一个内置的参数解析库。
sys.argv 示例
import sys
print(type(sys.argv))
print(sys.argv)
文件名是test.py
,执行示例:
▶ python3 test.py
<class 'list'>
['test.py']
▶ python3 test.py hello
<class 'list'>
['test.py', 'hello']
▶ python3 test.py -num 12
<class 'list'>
['test.py', '-num', '12']
sys.argv 只是简单的存储了命令行参数, 我们在使用时,可能会有下面的需求:
- 无参数时展示帮助
- 必须有2个参数
- 获取
-num
之后的参数 - 等等
这就需要解析命令行参数。我们可以自己写解析逻辑,也可以用一些参数解析库帮助我们快速开发解析逻辑。
getopt 的使用
示例1
文件名: test_getopt.py
,代码:
import sys
import getopt
opts, args = getopt.getopt(sys.argv[1:], '-h', ['help'])
print(opts)
print(args)
执行示例:
▶ python3 test_getopt.py help
[]
['help']
▶ python3 test_getopt.py --help
[('--help', '')]
[]
getopt.getopt
参数解释:
- 参数1:被解析的命令行参数列表,注意
sys.argv[0]
是Python文件名,不属于参数列表。 - 参数2:短参数名集合
- 参数3:可选,每个短参数名对应的长参数名。一般用列表类型。
返回值有两个:
- 返回值1:解析的参数键值对
- 返回值2:未解析的参数键值对
示例2
文件名: test_getopt.py
,代码:
import sys
import getopt
opts, args = getopt.getopt(sys.argv[1:], '-h-f:', ['help', 'filename='])
print(opts)
print(args)
-f:
表示 -f
后是参数值,对应的filename=
,表示要写成 --filename=xxx
。
执行示例:
▶ python3 test_getopt.py -h -f tmp.txt
[('-h', ''), ('-f', 'tmp.txt')]
[]
▶ python3 test_getopt.py -h --filename=tmp.txt
[('-h', ''), ('--filename', 'tmp.txt')]
[]
▶ python3 test_getopt.py -h --filename=tmp.txt abc
[('-h', ''), ('--filename', 'tmp.txt')]
['abc']
示例3
基于示例2,我们加一些具体的处理逻辑:
import sys
import getopt
opts, args = getopt.getopt(sys.argv[1:], '-h-f:', ['help', 'filename='])
for opt_name,opt_value in opts:
if opt_name in ('-h','--help'):
print('帮助文档')
exit()
elif opt_name in ('-f', '--filename'):
print('开始处理文件', opt_value)
# 一些处理逻辑
exit()
else:
print('什么都不做')
使用示例:
▶ python3 test_getopt.py -h
帮助文档
▶ python3 test_getopt.py -h --filename=tmp.txt
帮助文档
▶ python3 test_getopt.py --filename=tmp.txt
开始处理文件 tmp.txt