为python脚本生成命令行
1、引言
小屌丝:鱼哥,请教个问题?
 小鱼:可以拒绝吗?
 小屌丝:可以拒绝,反正妹子约我去按脚~
 小鱼:…(我擦~~ 被攻击到软肋了…) 这个现在有时间了。
 小屌丝:确定有时间了?
 小鱼:肯定的了,有啥问题,直接说吧
 小屌丝:嗯…额…确定现在可以问是吧?
 小鱼:你赶紧的,什么时候变得这么墨迹了
 小屌丝:好吧,那我就不客气了
 小鱼:(⊙o⊙)…
 小屌丝:我最近在写脚本,发现如果修改一个参数,就得大动干戈…有没有什么简便的方法,让我修改最少的代码,实现想要的参数…
 小鱼:详细说来~
 小屌丝:嗯, 咱们直接看代码吧!
2、常规方法
定义scrape方法,爬取某网站信息,timeout设置为5秒,
 代码展示
# -*- coding: utf-8 -*-
# @Time   : 2022-01-28
# @Author : carl_DJ
import requests
'''
定义scrape方法,爬取某网站后返回的状态及url,timeout设置为5秒
'''
def scrape(url,timeout = 5):
    resp = requests.get(url=url,timeout=timeout)
    resp_url = resp.url
    resp_code = resp.status_code
    print(f'返回状态码:{resp_code}')
    print(f'返回url:{resp_url}')
 
小屌丝:如果直接调用,直接如下方式就可以,
scrape('https://blog.csdn.net/wuyoudeyuer', 5)
 
小屌丝:但是,想修改参数,再调用,就需要在改代码了
 小鱼:你可以用argparse,每个参数都声明一下,不就好了?
代码展示
parser = argparse.ArgumentParser(description='Scrape Function')
parser.add_argument('url', type=str,
                    help='an integer for the accumulator')
parser.add_argument('timeout',  type=int,
                    help='sum the integers (default: find the max)')
if __name__ == '__main__':
    args = parser.parse_args()
    scrape(args.url, args.timeout)
 
调用的时候,就直接写:
python testscr.py https://blog.csdn.net/wuyoudeyuer 5
 
小屌丝:这也是一种办法,但是,能不能再简单一点的呢?
 小鱼:额…吃现成的还嫌事多… 有,上车!
3、Fire模块
3.1 模块介绍
Fire是一个很奈斯的第三方库,
 可以快速为某个python方法或者类添加命令行的参数支持。
说以,
 第一步,老规矩,安装:
pip install fire
 
其他方式安装:
3.2 代码示例
3.2.1 参数替换
安装完成,我们就先来一个简答的实例,
 从 Hello carl_奕然 开始
 示例一
# -*- coding: utf-8 -*-
# @Time   : 2022-01-28
# @Author : carl_DJ
import  fire
#name直接传入默认参数 
def hello(name = 'Carl_奕然'):
    return "Hello %s !" %name
if __name__ == '__main__':
    fire.Fire(hello)
 
运行结果展示:
Hello Carl_奕然 !
 
结果很奈斯,也是我们想要的,
 但是这是什么原理呢? 我们来一探究竟。
执行命令:
python test.py --help
 
展示内容:
NAME
    test.py
SYNOPSIS
    test.py <flags>
FLAGS
    --name=NAME
        Default: 'Carl_奕然'
 
可以看到,将 name 这个参数转化成了命令行的一个可选参数,我们可以通过 —-name 来替换 name 参数。
那么,我们就来试一下
python test.py --name DJ
 
运行结果:
Hello DJ !
 
小屌丝:我去~~ 可以啊鱼哥,真奈斯!
 小鱼:你以为的 fire就这点功能?? 来,继续!
 
 小屌丝:这还收不住了… 好吧,继续你的表演。
3.2.2 类支持
fire这个库,还支持对类添加命令行。
# -*- coding: utf-8 -*-
# @Time   : 2022-01-28
# @Author : carl_DJ
import fire
#定义Calculator类
class Calculator(object):    
	#double方法
    def double(self, number):
        return 2 * number
if __name__ == '__main__':
    fire.Fire(Calculator)
 
执行命令:
python test.py 
 
运行结果:
NAME
    test.py
SYNOPSIS
    test.py COMMAND
COMMANDS
    COMMAND is one of the following:
     double
 
我们可以看到,这里它将 Calculator 这个类中的方法识别出来了,COMMAND 之一就是 double,我们再调用一次double,
执行命令:
python test.py double
 
运行结果:
ERROR: The function received no value for the required argument: number
Usage: test.py double NUMBER
For detailed information on this command, run:
  test.py double --help
 
我们可以看到,报错信息,是需要传入参数
 我们在调整一次,
执行命令:
python test.py double 3
 
运行结果
6
 
很奈斯,是我们想要的结果。
3.2.3 代码示例
最后,我们针对第一个scrape函数,进行修改
# -*- coding: utf-8 -*-
# @Time   : 2022-01-28
# @Author : carl_DJ   
import requests
import fire
'''
定义scrape方法,爬取某网站信息,timeout设置为5秒
'''
def scrape(url,timeout = 5):
    resp = requests.get(url=url,timeout=timeout)
    resp_url = resp.url
    resp_code = resp.status_code
    print(f'返回状态码:{resp_code}')
    print(f'返回url:{resp_url}')
    
if __name__ == '__main__':
    fire.Fire(scrape)
 
执行命令:
python test.py https://blog.csdn.net/wuyoudeyuer --timeout 5
 
执行结果:
返回状态码:200
返回url:https://blog.csdn.net/wuyoudeyuer
 
奈斯。
4、总结
写到这里,今天的分享就差不多结束了。
 主要分享了fire对函数及类的修改,省去了我们修改代码的时间。
 最主要的是,我们又get了一个新技能。










