详解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的pyxmpp2中的主循环使其提高性能
Apr 24 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
使用Python 统计高频字数的方法
Jan 31 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
python实现udp聊天窗口
Mar 31 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
python如何修改文件时间属性
Feb 05 Python
python线程优先级队列知识点总结
Feb 28 Python
如何使用pdb进行Python调试
Jun 30 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
php基础知识:函数基础知识
2006/12/13 PHP
php定时执行任务设置详解
2015/02/06 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
python实现机器学习之元线性回归
2018/09/06 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
python 画条形图(柱状图)实例
2020/04/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
动物科学专业毕业生的自我评价
2013/11/29 职场文书
司机检讨书
2014/02/13 职场文书
2014年度党员自我评议
2014/09/13 职场文书
授权收款委托书范本
2014/10/10 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
python中使用redis用法详解
2022/12/24 Redis