如何获取Python 代码的命令行参数?
群里突然有人问,说“哥们,Python那个命令行参数你一般咋搞?”我脑子还没反应过来,差点把鸡腿骨都啃掉,真是困死了。说起来,这玩意其实用得还挺多,就是日常写脚本,或者平时咱们跑个测试脚本啥的,很多时候都得靠命令行参数灵活一点,要不然每次都得去改代码,那不累死。
就先拿最基础的说吧,最最常见的方式,其实直接用那个sys.argv,你们都知道吧,标准库sys,直接就能用。比如你搞个hello.py,内容就:
import sys
print("你输入的参数有:", sys.argv)
然后你命令行里敲:
python hello.py a b c
它就会输出['hello.py', 'a', 'b', 'c'],第一个永远是脚本名,后面是你传的参数。这东西优点是啥呢?懒,直接搞,缺点也有——只能拿到字符串,啥类型转换都得你自己弄,而且一点都不优雅。比如你想要个参数是数字,那你得自己转,不然全是字符串。要不然你就得:
num = int(sys.argv[1])
一不小心参数没传全,直接就抛异常了,谁爱用谁用,反正我觉得凑合行,场景简单还行。
后来吧,咱们稍微想优雅点,或者参数多点的时候,肯定不能这么写了,容易乱。基本上都用argparse了,这个真心推荐,不用都不好意思说自己搞过命令行脚本。那天我们组的小李写个分析日志的脚本,参数四五个,他说想自动生成帮助文档,于是就用这个了。用法巨简单:
import argparse
parser = argparse.ArgumentParser(description='这是描述信息,写点啥都行')
parser.add_argument('--name', type=str, help='名字')
parser.add_argument('--age', type=int, help='年龄')
parser.add_argument('--debug', action='store_true', help='开启调试模式')
args = parser.parse_args()
print(args.name, args.age, args.debug)
你就可以这样用了:
python 脚本.py --name 东哥 --age 20 --debug
有意思的是,你如果敲python 脚本.py --help,它还能自动帮你生成用法说明。这东西还有啥好玩的?你可以搞必填参数、默认值、选项类型,基本能满足你所有骚操作。缺点其实也有,就是配置多了稍微麻烦点,但是已经比自己硬撸强太多了。
再进阶一点,比如你要子命令对吧,像git那种git commit、git push的风格,这玩意也能搞,不过得用add_subparsers。一般咱们写运维脚本也用不上,真要用到的时候直接查文档,别死记硬背。
对了,还有一堆简易点的,比如getopt,这个我感觉完全是被历史淘汰了,没啥必要再用。有人喜欢用第三方库,比如click,这个是真的舒服,装一下就能用,语法贼简洁,像写装饰器一样写命令行参数,我给你看一眼:
import click
@click.command()
@click.option('--name', default='东哥', help='名字')
defhello(name):
click.echo(f'Hello, {name}!')
if __name__ == '__main__':
hello()
这玩意适合写小工具,有时候公司内网自己造工具也用click,图个快。
总之啊,平时写脚本你要是就用来临时跑个东西,sys.argv凑合着用;要是你这东西要发给同事,或者希望加点参数校验、自动help啥的,还是老实用argparse。高级玩法click也不错,看你习惯吧,反正我现在大部分都是argparse。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领