还在用sys来获取命令行参数吗?试试fire吧

329 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

前言

说到Python如何获取命令行参数,相信大部分人第一时间想到的就是sys模块了。我们可以通过sys.argv来获取命令行的参数。

虽说sys能够满足我们的需求,但是sys的功能较单一,获取及输入提示都得自己手动声明。今天就来介绍一个超级好用的Python命令行工具fire。

fire工具简介及安装

fire工具是谷歌在2017年开源的,使用方便,可以基于任何Python对象(如函数、类、模块、对象、字典、列表、元组)生成命令行接口。

安装

我们通常用pip或者conda来安装:

  • pip:pip install fire
  • conda:conda install fire -c conda-force

fire使用方法

基本使用

首先来一个简单例子,就能了解fire的基本使用方法了。

import fire
def test_fire(name):
    print("I'm {}".format(name))

fire.Fire(test_fire)

例子很简单,test_fire()需要从命令行接收参数name。我们只需要调用fire模块,然后将test_fire对象传入Fire()中就行了。

我们传输参数也很简单,支持位置传参和关键字传参。

python test.py Mick
python test.py --name=Mick

当我们不知道需要传哪些参数时,可以输入--help-h来获取提示。下面就是输入help后的提示,需要的参数很明显就是name了。

NAME
    test.py

SYNOPSIS
    test.py NAME

POSITIONAL ARGUMENTS
    NAME

NOTES
    You can also use flags syntax for POSITIONAL ARGUMENTS

如果我们没传对参数,fire也会有相应的报错,把本应传递的参数告诉我们。比如我们没传参数,提示如下:

➜  ~ python test.py
ERROR: The function received no value for the required argument: name
Usage: test.py NAME

For detailed information on this command, run:
  test.py --help

fire在类中的使用

上述例子fire是作用于函数中,简介时有说,fire几乎支持所有对象的调用。我们来个类调用例子吧。

import fire

class Test():
    def print_msg(self, msg):
        print(msg)

fire.Fire(Test)

使用方法和函数的类似,将class对象传递到Fire中即可。当我们要执行时,参考函数的传递,输入类中的函数名 再输入要传递的参数,使用很简单。

python test.py print_msg hhh
python test.py print_msg --msg=hhh

多个对象同时使用fire

上面的例子fire都是作用于单个对象。当我们一个py文件内有多个对象要使用命令行参数时,是不是得写多个fire作用于对象呢?答案是不需要的。我们以多个函数使用命令行参数为例:

import fire
def test1(name):
    print("I'm {}".format(name))

def test2(age):
    print('my age is {}'.format(age))

fire.Fire()

例子中有test1()test2()函数,都需要命令行传参。我们只需用一行命令fire.Fire()即可,无需分别调用。使用时我们可以输入python test.py -h看看帮助信息,COMMANDS中提示可用于test1或者test2中的一个。

NAME
    test.py

SYNOPSIS
    test.py GROUP | COMMAND

GROUPS
    GROUP is one of the following:

     fire
       The Python Fire module.

COMMANDS
    COMMAND is one of the following:

     test1

     test2

知道了这2个对象可用,后面的参数就和单个函数的使用一样了:

~ python test.py test1 Mick
I'm Mick
~ python test.py test2 23
my age is 23

小结

fire包作为Python命令行参数工具非常好用,对核心代码也没有入侵行为,如果你还在用sys来获取命令行参数,不妨试试fire吧。