Python技术迷

如何获取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 全部免费领