Python3,3行代码,自动为脚本生成命令行,我默默的收藏了。

举报
Carl_奕然 发表于 2023/03/13 11:16:01 2023/03/13
【摘要】 看到这个,我默默点了收藏功能。

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了一个新技能。

我是​小鱼​:

  • CSDN 博客专家;
  • 阿里云 专家博主;
  • 51CTO 博客专家;
  • 51认证讲师;
  • 金牌面试官&面试培训师;

关注我,带你学习更多更有趣的Python知识。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。