详解python中的三种命令行模块(sys.argv,argparse,click)


Posted in Python onDecember 15, 2020

Python作为一门脚本语言,经常作为脚本接受命令行传入参数,Python接受命令行参数大概有三种方式。因为在日常工作场景会经常使用到,这里对这几种方式进行总结。

命令行参数模块

这里命令行参数模块平时工作中用到最多就是这三种模块:sys.argv,argparse,click。sys.argv和argparse都是内置模块,click则是第三方模块。

sys.argv模块(内置模块)

先看一个简单的示例:

#!/usr/bin/python
import sys

def hello(name, age, sex, *args):
  print("Hello, My name is {name}.".format(name=name))
  print("I'm {age} years old.".format(age=age))
  print("I'm a {sex}".format(sex=sex))

  print("Other word:\n{args}".format(args="\n".join(args)))


if __name__ == "__main__":
  file_name = sys.argv[0]
  name = sys.argv[1]
  age = sys.argv[2]
  sex = sys.argv[3]
  other = sys.argv[4:]
  hello(name, age, sex, *other)

调用脚本:

python test_sysargv.py zhangsan 13 man nibi ss

脚本输出:

Hello, My name is zhangsan.
I'm 13 years old.
I'm a man
Other word:
nibi
ss

sys.argv模块不难理解,命令参数作为列表传入Python脚本中,argv[0]是脚本的名字,argv[1]则是第一个参数,后面以此类推。所以在脚本中只需要提取列表中的参数即可使用。上面演示的是正确调用Python脚本的情况,下面则是调用失败的情况。

错误调用脚本:

python test_sysargv.py zhangsan 13

错误输出:

Traceback (most recent call last):
 File "test_sysargv.py", line 16, in <module>
  sex = sys.argv[3]
IndexError: list index out of range

关于错误也很好理解,经典的列表索引超出范围,之所列表索引超出范围,没有传入足够的参数。当然你可以使用try...except捕获错误。但是这种做法太过死板,因为在命令行中必须按照脚本规定的参数顺序输入参数,所以这种模块使用一般是针对一些需要的参数比较少并且固定的脚本。

argparse模块(内置模块)

同样的先看一个简单的示例:

#!/usr/bin/python
import argparse

parser = argparse.ArgumentParser(description='Test for argparse module.')  # 构建命令参数实例
parser.add_argument("--name", "-n", help="name attribute: 非必要属性")
parser.add_argument("--age", "-a", help="age attribute: 非必要属性")
parser.add_argument("--sex", "-s", help="sex attribute: 非必要属性")
parser.add_argument("--type", "-t", help="type attribute: 非必要属性", required=True)
args = parser.parse_args()


def hello(name, age, sex, *args):
  print("Hello, My name is {name}.".format(name=name))
  print("I'm {age} years old.".format(age=age))
  print("I'm a {sex}".format(sex=sex))

  print("Other word:\n{args}".format(args="\n".join(args)))


if __name__ == "__main__":
  print("Format of transfer file: {type}".format(type=args.type))
  if args.name and args.age and args.sex:
    hello(args.name, args.age, args.sex)

执行脚本:

python3 test_argparse.py -t json -n zhangsan -a 13 -s man

脚本成功输出:

Format of transfer file: json
Hello, My name is zhangsan.
I'm 13 years old.
I'm a man
Other word:

关于argparse模块的使用,首先需要生成一个命令行参数的实例,然后通过对这个对象添加属性,添加需要从命令行获取的参数,包括哪些是必要参数(required=True),哪些非必要参数,同时也可以对每个参数进行帮助提示(help="")。

而上面示例中分别添加了四个属性,--name和-n同时可以再命令行中使用,都表示了参数name。ArgumentParser通过parse_ags()方法解析参数,检查命令行,将每个参数转换为适当的类型,所以在脚本中同时也可以使用args.n和args.name获取到参数,相对应的如果没有传入该参数,脚本中则获取到None。

查看命令行参数之后脚本的帮助提示:

python3 test_argparse.py -h
usage: test_argparse.py [-h] [--name NAME] [--age AGE] [--sex SEX] --type TYPE

Test for argparse module.

optional arguments:
 -h, --help      show this help message and exit
 --name NAME, -n NAME name attribute: 非必要属性
 --age AGE, -a AGE   age attribute: 非必要属性
 --sex SEX, -s SEX   sex attribute: 非必要属性
 --type TYPE, -t TYPE type attribute: 非必要属性

另外在添加命令行参数的属性中,还有更多的设置,多余的可以参考Python官方文档,里面都有详细的标注,这里就不展开来讲,总结的就是关于argparse模块的使用非常简便,同时十分人性化,也很符合日常工作的需要。

click模块

先开一个简单的使用示例:

#!/usr/bin/python
import click

@click.command()
@click.option("--name", default="zhangsan", help="name attribute: 非必要属性")
@click.option("--age", help="age attribute", type=int)
@click.option("--sex", help="sex attribute")
@click.option("-t", help="type attribute: 必要属性", required=True)
def hello(t, name, age, sex, *args):
  print("Format of transfer file: {type}".format(type=t))
  print("Hello, My name is {name}.".format(name=name))
  print("I'm {age} years old.".format(age=age))
  print("I'm a {sex}".format(sex=sex))

  print("Other word:\n{args}".format(args="\n".join(args)))


if __name__ == "__main__":
  hello()

执行脚本:

python3 test_click.py -t 1 --age 13 --sex man

脚本输出:

Format of transfer file: 1
Hello, My name is zhangsan.
I'm 13 years old.
I'm a man
Other word:

click模块是Flask团队优秀的开源项目,使用方法和argparse模块很相似,同样为命令行封装了大量的方法,使用者只需要专注代码功能的实现。
click模块和argparse模块不同的地方就是,click模块使用装饰器的方式给函数添加命令行属性,关于装饰器简单来讲就是能够在不修改原有函数的基础上添加功能。虽然使用装饰器但是添加命令行属性的方式和argparse模块很相似,包括options中常用的参数含义也有很多类似的地方。值得注意的就是一开始需要通过command()将函数成为命令行的接口。
关于的click模块的就大致讲到这里,其余有兴趣的可以再去了解一下。

总结

关于这三个模块值得注意的是,尽量贴近自己应用场景去选择,真正的做到自己能够方便使用才是你去使用这些模块的原因。

以上就是详解python中的三种命令行模块(sys.argv,argparse,click)的详细内容,更多关于python 命令行模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python计算方程式根的方法
May 07 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
python挖矿算力测试程序详解
Jul 03 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
详解python中的模块及包导入
Aug 30 Python
在django中自定义字段Field详解
Dec 03 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
python和opencv构建运动检测器的实现
Mar 03 Python
python 基于Apscheduler实现定时任务
Dec 15 #Python
next在python中返回迭代器的实例方法
Dec 15 #Python
python中slice参数过长的处理方法及实例
Dec 15 #Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 #Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 #Python
详解python中的异常捕获
Dec 15 #Python
python 6种方法实现单例模式
Dec 15 #Python
You might like
实用函数10
2007/11/08 PHP
php的hash算法介绍
2014/02/13 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
python读取与处理netcdf数据方式
2020/02/14 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
几道PHP的面试题
2012/05/19 面试题
网吧收银员岗位职责
2013/12/14 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
预备党员的自我评价
2014/03/12 职场文书
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
2015党建工作简报
2015/07/21 职场文书
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL