Python 3:使用 getopt 库解析命令行参数


#Python#


命令行参数会存放在 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

( 本文完 )