在 Python 中,命令行解析库有非常多的选择方案,系统自带的 模块有 argparse,有 Flask 作者写的 click,但是 argparse 使用起来啰嗦, 要经历解析器初始化、参数定义、解析一套流程。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# -*- coding: utf-8 -*-
# arg_test.py
import
argparse
def
counter
(
file_type
=
None
)
:
return
{
file_type
:
100
}
# 初始化解析器
parser
=
argparse
.
ArgumentParser
(
)
# 定义参数
parser
.
add_argument
(
&
quot
;
-
f
&
quot
;
,
&
quot
;
--
file
&
quot
;
,
help
=&
quot
;统计指定文件类型
&
quot
;
)
# 解析
args
=
parser
.
parse_args
(
)
print
(
counter
(
args
.
file
)
)
|
运行:
1
2
3
|
$
python
arg_test
.
py
-
f
python
{
'python'
:
100
}
|
而 click 则是以装饰器的形式作用在目标函数中,要侵入函数本身,本质上还是对 argparse 的一种改进,并没有太多创新,算是一种改良作品
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# -*- coding: utf-8 -*-
import
argparse
import
click
@
click
.
command
(
)
@
click
.
option
(
&
quot
;
-
f
&
quot
;
,
&
quot
;
--
file
&
quot
;
,
help
=&
quot
;统计制定文件类型
&
quot
;
)
def
counter
(
file
=
None
)
:
click
.
echo
(
{
file
:
100
}
)
if
__name__
==
'__main__'
:
print
(
counter
(
)
)
|
运行:
1
2
3
|
$
python
firetest
.
py
-
f
python
{
u
'python'
:
100
}
|
接下来要介绍的这个命令行解析工具非常牛逼,把命令行工具做到了极致,算是一种颠覆式创新,一行代码能把函数导出到命令行窗口,这个工具叫Python-fire,可能经常写命令行工具的人知道,该项目是 Google 开源的 Python 库(可能是 Google 工程师的 Side Project,因为项目主页申明说它不是 Google 官方项目),名字就像一团🔥。
安装
1
2
|
pip
install
fire
|
用法1: fire.Fire()
直接在程序中调用 fire.Fire(),不需要修改目标函数,fire 会把当前模块下的所有对象导出到命令行中
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# firetest.py
import
fire
def
foo
(
name
)
:
return
'foo {name}!'
.
format
(
name
=
name
)
def
bar
(
name
)
:
return
&
quot
;
bar
{
name
}
&
quot
;
.
format
(
name
=
name
)
if
__name__
==
'__main__'
:
fire
.
Fire
(
)
|
运行:
1
2
3
4
5
6
7
8
9
|
# 调用方式:python [文件名] [函数名] [参数]
# 函数名后面直接跟参数值
$
python
firetest
.
py
foo
hello
foo
hello
!
# 也可以显示地先指定参数名,再跟参数值
$
python
firetest
.
py
bar
--
name
hello
bar
hello
!
|
用法2: fire.Fire(<fn>)
Fire 可以指定某个函数导出到命令行
1
2
3
4
5
6
7
8
|
import
fire
def
foo
(
name
)
:
return
'foo {name}!'
.
format
(
name
=
name
)
if
__name__
==
'__main__'
:
fire
.
Fire
(
foo
)
|
运行:
1
2
3
4
|
# 调用方式:python [函数名] [参数]
$
python
firetest
.
py
hello
foo
hello
!
|
当 Fire 接收函数 foo 作为参数时,只加载 foo 函数到命令行中,此时,在命令行中运行时也无需再指定函数名字,只需要指定参数就好。
用法3:fire.Fire(<dict>)
Fire 不仅可以接收函数,还可以接收字典对象作为参数,可在字典中配置那些函数需要导出到命令行中。例如,有加减乘3个函数,我们可以选择性的选择其中2个导出到命令行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import
fire
def
add
(
x
,
y
)
:
return
x
+
y
def
multiply
(
x
,
y
)
:
return
x
*
y
def
subtract
(
x
,
y
)
:
return
x
-
y
if
__name__
==
'__main__'
:
fire
.
Fire
(
{
'add'
:
add
,
'subtract'
:
subtract
,
}
)
|
运行:
1
2
3
4
5
6
7
|
$
python
firetest
.
py
add
1
4
5
$
python
firetest
.
py
subtract
1
4
-
3
$
python
firetest
.
py
multiply
1
4
# multiply 会报错,因为没有导出
|
用法4:fire.Fire(<object>)
Fire 还可以接收类的实例对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
fire
class
Calculator
(
object
)
:
def
add
(
self
,
x
,
y
)
:
return
x
+
y
def
multiply
(
self
,
x
,
y
)
:
return
x
*
y
if
__name__
==
'__main__'
:
calculator
=
Calculator
(
)
fire
.
Fire
(
calculator
)
|
使用方式还是和前面的一样
1
2
3
4
5
|
$
python
firetest
.
py
add
10
20
30
$
python
firetest
.
py
multiply
10
20
200
|
更多用法可以参考python-fire的文档:https://github.com/google/python-fire/blob/master/docs/guide.md
> https://mp.weixin.qq.com/s/lMOieL_RFRHsh5OW4G4axg