Python命令行模块(sys.argv,argparse,click)
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命令行参数sys.argv[]
学习C语言的时候就没弄明白命令行参数的用法,在学习Pyton 的时候又遇到了命令行参数,在这里稍微学习了一下,稍微明白了一些在这里做个记录方便后面回顾复习. Sys.argv[]是用来获取命令行参数的 ...
- 快速上手 Python 命令行模块 Click
关于Click? 说下 Click 模块是干啥的,简单说,它就是把我们的 Python 脚本的一些函数,通过 添加带有 Click 关键字的装饰器进行装饰进而将函数调用的形式转化为命令行传参的形式然后 ...
- Python 命令行之旅 —— 初探 argparse
『讲解开源项目系列』启动--让对开源项目感兴趣的人不再畏惧.让开源项目的发起者不再孤单.跟着我们的文章,你会发现编程的乐趣.使用和发现参与开源项目如此简单.欢迎联系我们给我们投稿,让更多人爱上开源.贡 ...
- Python 命令行之旅:深入 click 之参数篇
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- Python 命令行参数解析工具 argparse
为什么需要argparse 开门见山,举一个简易计算器代码的例子,其中sys.argv用来读取脚本执行时后面传入的参数. def calculator(x, y, operation): if &qu ...
- Python 命令行之旅:深入 click 之选项篇
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- python命令行工具的使用——argparse
argparse是一个常用的库函数,使用它的时候我们在命令行中不仅仅可以运行python文件,更可以零时调整参数,十分方便. 首先,如果你只是希望传一丢丢数据进去,那么只看下面两行就行了 import ...
- Python 命令行之旅:使用 click 实现 git 命令
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- Python 命令行之旅 —— 深入 argparse (一)
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
随机推荐
- webug第十五关:什么?图片上传不了?
第十五关:什么?图片上传不了? 直接上传php一句话失败,将content type改为图片 成功
- Java 枚举 enum 详解
本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...
- 数据丢失如何恢复?EasyRecovery帮你快速实现
在日常使用电脑时,我们经常会遇到误删文件的情况,若文件还未被彻底删除,我们还可以通过电脑中的回收站将其恢复,但若是回收站都被清空的话,想要恢复文件就变得比较困难了,而EasyRecovery可以很好的 ...
- 灵彤彤女版PUA机构火了!“我花了8888报名学撩汉,却被导师骗去卖身。
最近,几张女PUA机构的导师和课程海报在社交网络广泛刷屏. 而社长觉得自己可以去潜心研究一下,为什么有女PUA机构的这种课程呢? 爱情的确是一门玄学. 精通此技能的女孩桃花不断,前任和现任无缝切换 ...
- JVM类加载机制详解,建议看这一篇就够了,深入浅出总结的十分详细!
类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的时机 遇到new(比如n ...
- presto 访问kudu 多schemas配置
presto需要访问kudu数据源,但是impala可以直接支持多数据库存储,但是presto不能原生支持,按照presto的官网设置了然而并不起作用. 官方文档: 到官方github提问了,然后并没 ...
- 思维导图学 Kotlin
前言 最近做了<Kotlin实战>的思维导图笔记,Kotlin真香-- 目录 基础 函数 类.对象 λ表达式 类型 约定 高阶函数.泛型 公众号 coding 笔记.点滴记录,以后的文章也 ...
- 文艺splay,占坑等着填
昨天CF上去就A了前三道题,然后自闭罚坐一个小时什么也没写出来23333.似乎D题人均wa3发就很烦.还是肤浅了 今天精神状态不太好,可能是晚睡的缘故,那不如明天一起写了算了 蹲一波大选结果,蹲一波s ...
- npm常用操作
Npm常用操作 1. 淘宝镜像 1.1 npm临时使用淘宝镜像安装依赖包 npm i -g express --registry https://registry.npm.taobao.org 1.2 ...
- 第2.3节 Python运算符大全
一. Python的算术运算 Python的算术运算符与C语言类似,略有不同.包括加(+).减(-).乘(*).除(/).取余(%).按位或(|).按位与(&).按位求补(~).左移位(< ...