对于python命令行,你应该这么做才专业

简介: 在python开发中,我们经常会遇到在执行.py文件时,需要给代码传参的情况。遇到传参的场景,最基础的传参方式为*.py argv1 argv2 ...,然后我们在代码中通过sya.argv来解析入参。这样使用没有问题,但是不严谨、不正式,更不够帅气...谁知道你这些参数是干嘛的?其实python基于sys.argv的命令行参数,存在三个模块getopt --> optprase --> argprase。今天咱们来说说处于命令行模块顶峰的argprase!入门五板斧

前言


今天和大家聊聊python命令行参数,虽然使用场景没有字符串多,但细节觉得成败,当别人看到你提供更优雅的调用方式时,会对你的严谨点赞。此时,深藏功与名!升堂...


python命令行参数


在python开发中,我们经常会遇到在执行.py文件时,需要给代码传参的情况。

遇到传参的场景,最基础的传参方式为*.py argv1 argv2 ...,然后我们在代码中通过sya.argv来解析入参。


这样使用没有问题,但是不严谨、不正式,更不够帅气...谁知道你这些参数是干嘛的?

其实python基于sys.argv的命令行参数,存在三个模块getopt --> optprase --> argprase。今天咱们来说说处于命令行模块顶峰的argprase


入门五板斧


# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/6/25 23:58
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : 11.python_argparse_cookbook.py
# 导入模块
import argparse
# 实例化解析器对象
parser = argparse.ArgumentParser(description='python argparse cookbook')
# 添加参数
parser.add_argument('-v', '--version', help="get version")
# 获取参数集合
args = parser.parse_args()
# 打印参数值
print("User input code version is: {}".format(args.version))

关于ArgumentParser


ArgumentParser用于创建解析器对象,它提供了很多可选参数:

Object for parsing command line strings into Python objects.

Keyword Arguments:

  • prog -- The name of the program (default: sys.argv[0])
  • usage -- A usage message (default: auto-generated from arguments)
  • description -- A description of what the program does
  • epilog -- Text following the argument descriptions
  • parents -- Parsers whose arguments should be copied into this one
  • formatter_class -- HelpFormatter class for printing help messages
  • prefix_chars -- Characters that prefix optional arguments
  • fromfile_prefix_chars -- Characters that prefix files containing
    additional arguments
  • argument_default -- The default value for all arguments
  • conflict_handler -- String indicating how to handle conflicts
  • add_help -- Add a -h/-help option
  • allow_abbrev -- Allow long options to be abbreviated unambiguously


其中description用于添加对程序的描述,使用较多,其他的作为了解即可:

  • prog - 程序的名字(默认:sys.argv[0])
  • usage - 描述程序用法的字符串(默认:从解析器的参数生成)
  • description - 参数帮助信息之前的文本(默认:空)
  • epilog - 参数帮助信息之后的文本(默认:空)
  • parents - ArgumentParser 对象的一个列表,这些对象的参数应该包括进去
  • formatter_class - 定制化帮助信息的类
  • prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
  • fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
  • argument_default - 参数的全局默认值(默认:None)
  • conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
  • add_help - 给解析器添加-h/–help 选项(默认:True)

精髓:add_argument


add_argument作为整个模块的重头戏,我们需要仔细学习。

完整格式如下:

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
  • action - 命令行遇到参数时的动作,默认值是 store。
  • nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional - - - argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
  • const - action 和 nargs 所需要的常量值。
  • default - 不指定参数时的默认值。
  • type - 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 可选参数是否可以省略 (仅针对可选参数)。
  • help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
  • metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
  • dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
    add_argument 用于添加入参,其中分为定位参数可选参数,如何区别?

定位参数


比如我们程序每次必须要求先输入用户名,那么我们可以这么写:

import argparse
parser = argparse.ArgumentParser(description='python argparse cookbook')
parser.add_argument('user', help="input username")
parser.add_argument('pwd', help="input password")
parser.add_argument('-v', '--version', help="get version")
args = parser.parse_args()
print(args.user)
if args.version:
    print(args.version)


我们可以这么输入:

  • a.py qingfeng 123
  • a.py qingfeng 123 -v 1.0
  • a.py -v 1.0 qingfeng 123
  • a.py 123 -v 1.0 qingfeng # 注意这条


定位参数可以使用,但最好你的代码中,只存在一个定位参数,不然会出现最后一条例子的问题,你只要求我必须要输入参数,而没有要求我的输入顺序。这种情况我们还不如使用可选参数来明确规定**-u -p **来的更为直观,在理否?


可选参数


何为可选参数?在add_argument中添加以一个或者两个中划线“-”开头的参数,为可选参数(前提是你无聊到修改ArgumentParser中的prefix_chars参数)。eg:'-v'或者'--version'。


这两种可选参数使用时需注意的是,如果同时存在-v 和--version。用户可以使用任意一种方式进行传参,但我们在获取参数的时候,只能使用args.version才能获取对应的值。


action='store_true'

我们平时在使用命令行参数时,有些参数是无需传值的,比如最简单的ls -l

可如果这么操作,系统会报错啊。该如何是好?

parser.add_argument('-v', '--version', action='store_true', help="get version")

我们只需要将action赋值store_true,即可。


参数的默认值


当我们通过add_argument添加一个参数时,parser.parse_args()中就会初始化一个对应的参数,并进行赋值。

默认为None。上面说的action='store_true'时,默认参数为False。

当然我们可以通过default来变更默认的None为我们所想要的值


参数限制

这个用到的比较多,比如我们的代码,提供了对工具的安装、卸载、启动、停止等功能。我们可以这么操作...

parser.add_argument('-t', '--type', choices=['install','uninstall','start','stop'])

用户通过-t只能填写choices内部的指令,不然会提示invalid choice:入参错误

又比如,我们程序需要用户提供一个端口信息,端口必然是一个数字。针对端口是否为数字,我们可以获取参数后使用isinstance(port,int)来判断,但这样相当于重造了个轮子,argparse提供了type选项,可以在用户入参时,就直接校验,无需你再二次判断了!


demo:

parser.add_argument('-p', '--port', type=int)

当我们输入-p abc时,模块会给出提示:error: argument -p/--port: invalid int value: 'abc'


将可选参数变为必选


其实很简单:

parser.add_argument('-u','--user',required=True,help="input username")

如果为填写该参数,则会提示:the following arguments are required: -u/--user


The End


可能有些人要说,selenium系列是不太监了,只能说这个系列看的人太少了,有空了间隔着更新吧...





相关文章
|
8月前
|
安全 Python
轻松学会的Python红绿灯控制技巧,专业又精确
轻松学会的Python红绿灯控制技巧,专业又精确
168 0
|
3月前
|
Windows Python
【10月更文挑战第2天】「Mac上学Python 2」入门篇2 - 开发环境命令行操作与文件管理
本篇将详细介绍Windows和Mac系统中的常用命令行操作与文件管理,帮助用户掌握如何通过终端或命令提示符进行文件管理和操作开发环境。内容涵盖路径切换、文件与文件夹的创建、删除、查看文件内容等基本操作,这些技能是后续Python开发的基础。
136 6
【10月更文挑战第2天】「Mac上学Python 2」入门篇2 - 开发环境命令行操作与文件管理
|
3月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
520 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
5月前
|
Shell 数据处理 开发者
|
5月前
|
测试技术 Python
python 命令行参数 argparse详解
这篇文章是关于Python命令行参数解析库`argparse`的详细解释和使用教程。文中提供了完整的代码模板,包括如何定义命令行参数、如何添加位置参数、可选参数和布尔参数,以及如何解析和使用这些参数。文章还包含了示例代码和测试用例,以展示如何在实际程序中应用`argparse`库。
52 0
|
5月前
|
Linux UED iOS开发
Python colorama 设置控制台、命令行输出彩色文字
Python colorama 设置控制台、命令行输出彩色文字
80 0
|
5月前
|
SQL 分布式计算 算法
【python】python指南(二):命令行参数解析器ArgumentParser
【python】python指南(二):命令行参数解析器ArgumentParser
53 0
|
5月前
|
并行计算 数据可视化 Shell
Day 2/100:命令行下执行python代码!
Day 2/100:命令行下执行python代码!
40 0
|
5月前
|
Python
python命令行解析模块argparse
python命令行解析模块argparse
|
7月前
|
Python
python命令行传递参数的两种方式
python在命令行运行.py文件时,如何在命令行传递参数给运行程序,python默认提供了sys模块的系统参数属性实现接收命令行中的外部参数。 另一种则是通过argparse模块实现的,argparse模块可以实现事先对命令行参数的初始化,更加的便于命令行参数的管理。