Python如果在命令行传参?Python如果获取命令行传入的参数?Python命令行解析器argparse使用详解! ヽ(・ω・´メ) Python库

2023-05-16

文章目录

  • 简介
  • argparse库使用
    • 简介
    • `ArgumentParser()`设置整体内容
    • `add_argument()`定义参数
      • action属性
        • 自定义action属性
      • nargs属性
      • type属性
        • 自定义type属性
      • choices属性
    • parse_args() 方法
    • add_argument_group()分组方法
    • add_mutually_exclusive_group()互斥组

简介

Python可以在命令行中传参的方法当前常用的有三种,分别是

  1. sys.argv: 这个方法使用非常简单,但功能上的简陋不是最适合我们做项目使用的,比如他不能自动生成帮助文档(-h),并且只能进行位置传参等因素都大大限制了他的使用场景。
# 简单使用,引入sys
import sys
# 一般第零位的是我们项目的名称,并不是用户传入的参数
sys.argv[0]
# 一般这个就是用户传入的参数,可以赋值给变量,也可以使用输出函数(print())查看
sys.argv[1]
  1. argparse: 这是Python自带的专门用来做命令行选项的库,功能非常强大,官方文档(基于Python3.8的版本)下面我会详细介绍此库的使用。
  2. tf.app.flags: 这是TensorFlow这个库里带的一个命令行传参的方法,这是一个机器学习的库,并且他核心就是将argparse库进行了二次封装。所以这个库对于大多数人来说并不是最佳选择。

argparse库使用

本博客基于argparse的python3.8版本编写。
因为此库是Python内置库之一,所以我们直接就可以引入使用,无需pip安装

# 下面代码处此处引入我就省略了
from argparse import ArgumentParser

简介

argparse库中最主是其中的ArgumentParser()对象、add_argument()方法和parse_args()方法, 如果我们只是想写一个简单的传参命令,只需要他们三个怎么用就完全够了。

  1. ArgumentParser()对象: 定义当前传参这个模块的一些整体内容,比如是否开启帮助文档,帮助文档头是什么,当前运行的程序叫什么等功能;
  2. add_argument()方法: 定义一些我们传入的参数具体信息,比如传入的参数关键字是什么,传入的是什么类型的参数,传入参数的说明等;
  3. parse_args()方法: 解析执行,我们输入的值就需要通过此方法来在程序了获取;
  4. add_argument_group()方法: 参数组,建立不同的参数分组,增强帮助命令可读性;
  5. add_mutually_exclusive_group()方法: 互斥组,同一个互斥组的参数同时只能接收到一个;
  6. format_help()方法: 查看帮助命令(我们在捕获未知报错时try,可以方法此方法让用户自行检查是否输入错误);
    注: 上述对象属于类class,可以直接调用,比如ArgumentParser(),而方法属于函数def,需要在类的基础上调用,比如ArgumentParser().add_argument()

ArgumentParser()设置整体内容

ArgumentParser参数作用
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)
allow_abbrev如果缩写是无歧义的,则允许缩写长选项 (默认值:True)

比如:

命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本")
print(命令.format_help())

在这里插入图片描述
PS:

  1. 这里如果我们没有定义usage,则上述帮助的地方会显示我们写的程序名称(prog),如果我们也没有定义程序名称,则会自动取,当前py文件的名称。
  2. allow_abbrev:这里的缩写指的是如果有多个参数可以同时选择,比如-a,-b,-c我们都需要选择的时候可以缩写成-abc
  3. parents: 这个命令类似继承,如果他可以让另一个命令行解析器继承我们之前定义的解析器的参数。比如如下所示(如果想使用parents继承,最好将自动生成的帮助文档关闭,否则可能会出现参数重复导致报错!)
命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本", add_help=False)
命令.add_argument('-h', '--帮助', action='help', help='查看帮助信息')
备用命令 = ArgumentParser(parents=[命令], add_help=False)
print(备用命令.format_help())

add_argument()定义参数

add_argument参数作用
name or flags一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
action当参数在命令行中出现时使用的动作基本类型。
nargs命令行参数应当消耗的数目。
const被一些 action 和 nargs 选择所需求的常数。
default当参数未在命令行中出现时使用的值。
type命令行参数应当被转换成的类型(默认我们传入的参数会被定义为str字符型)。
choices可用的参数的容器。
required此命令行选项是否可省略 (仅选项可用)。
help一个此选项作用的简单描述。
metavar在使用方法消息中使用的参数值示例。
dest被添加到 parse_args() 所返回对象上的属性名。

基础传参:

命令 = ArgumentParser()
命令.add_argument('位置传参', help='这是最基础的位置传参')
命令.add_argument('-a', '--关键字传参', help='这是最基础的位置传参')
print(命令.parse_args())

ps:

  1. 默认情况下位置参数是必须传输的,关键字参数是可以选填的,可以使用required参数来改变此状态!
  2. 我们在程序中可以调用这些参数的值,比如%(default)s, %(type)s,除了add_argument()参数外,还有%(prog)s 也可以直接调用!
    在这里插入图片描述

action属性

action属性可选值含义
store存储当前的参数值(默认动作)
store_const存储被 const 命名参数指定的值
store_true和store_false这两个属性是将 const 已经预设成布尔值的 store_const 属性(action=store_true相当与action='store_const', const=True, default=False)
extend这会存储一个列表,并将每个参数值加入到列表中。
append存储一个列表,并且将每个参数值追加到列表中。
append_const存储一个列表,并将 const 命名参数指定的值追加到列表中。
count计算一个关键字参数出现的数目或次数。
help打印所有当前解析器中的选项和参数的完整帮助信息,然后退出。
version打印版本信息并退出。

PS:

  1. constdefault都可以看成默认值,他们的区别是,如果当前属性被调用,而每个给值,则会使用const,如果没有调用则会使用default

比如:

命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本",
                    add_help=False)
命令.add_argument('-h', '-帮助', '--help', action='help', help='查看帮助信息')
命令.add_argument('-a', '--全部', help='开启全部测试(默认开启)', action='store_true')
命令.add_argument('-m', '--模块', help='使用绕过的模块', action='store_const', const=[1, 2, 3, 4])
命令.add_argument('-u', '--url', help='目标的URL地址,比如http://127.0.0.1/')
命令.add_argument('-t', help='具体要扫描的目标,比如/index(默认:/)', dest="目标")
命令.add_argument('-v', '--版本', action='version', help='查看当前版本', version='%(prog)s 0.1 版本')
print(命令.parse_args(), 命令.parse_args().模块, 命令.parse_args().目标)

在这里插入图片描述

自定义action属性

我们可以自定义的action的规则,重写此规则我们可以继承from argparse import Action后重写def __init__def __call__这两个方法,我们主要在call中处理传入值,这里我也主要介绍call。

call属性作用
parser输出ArgumentParser()对象
namespace相当于ArgumentParser().parse_args()参数的返回值,显示所有用户输入的参数
values显示当前指定属性接收的内容
option_string显示当前指定的属性

比如这里我定义了一个规则,查看用户输入的url是否是http开头的的,如果不是就添加上,并推荐用户下次使用http开头的完整网址

# 这里我们还需要引入Action
from argparse import ArgumentParser, Action

class url规则(Action):
    ## init的参数:
    ## option_strings,dest,nargs=None,const=None,default=None,
    ## type=None,choices=None,required=False,help=None,metavar=None
    # def __init__(self, option_strings, dest, nargs=None, **kwargs):
    ## 这里是判断是否有默认的nargs,如果存在,则报错,这是官方示例中的一个案例。
    #     if nargs is not None:
    #         raise ValueError("不允许使用nargs")
    #     super().__init__(option_strings, dest, **kwargs)

    def __call__(self, parser, namespace, values, option_string=None):
        if values.rfind('http'):
            print('推荐在网站前面加入http://或者https://')
            url地址 = 'http://' + values
        setattr(namespace, self.dest, url地址)


命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本",
                    add_help=False)

命令.add_argument('-u', '--url', help='目标的URL地址,比如http://127.0.0.1/', action=url规则)

在这里插入图片描述

nargs属性

nargs属性可接收的值可以为

  1. 一个整数: 需要参数的数量
  2. *: 传入0位以上的参数
  3. +: 传入1位以上的参数(如果出现0位会报错)
  4. ?: 传入0到1位参数,(这种方法经常会配合文件传输使用)
  5. argarse.REMAINDER: 接收所有未被受用的参数
    这一部分的示例我放在和type属性一起进行展示!

type属性

属性参数中,除了可能会用到Python自带的整数型int,浮点型float,列表list等外,我们还可以使用open将接受类似设置为文件。
除此之外,我们还可以使用argparse.FileType()来进行对文件的更高阶的操作,他的功能和原版open类似,接受mode, bufsize, encodingerrorsopen() 函数参数。

命令 = ArgumentParser()
命令.add_argument('-a', '--关键字传参', nargs='*', type=list)
命令.add_argument('-i', '--整数', nargs='+', type=int)
命令.add_argument('-f', '--文件', nargs='?', type=open)
print(命令.parse_args())

在这里插入图片描述

自定义type属性

我们可以给type一个函数,然后在函数内自定义我们的类型属性!比如这里我就自动判断目标输入的是一个文件,还是一个字符串,如果是文件则将文件内容读取出来并返回

def 文件或字符识别(文本):
    # 判断如果输入的为文件则
    if len(文本) - 文本.rfind('.txt') == 4:
        try:
            with open(文本) as 文件:
                文本 = 文件.read()
            return 文本.split('\n')
        except:
            return [文本]
    else:
        return [文本]


命令 = ArgumentParser()
命令.add_argument('-t', dest="目标", nargs='*', type=文件或字符识别)
print(命令.parse_args())

PS: 需要注意的是,如果我们一次性接收多个目标,每个目标都会单独的被type属性执行一遍!
在这里插入图片描述

choices属性

命令 = ArgumentParser()
命令.add_argument('-l', dest="等级", type=int, choices=range(1, 4))
print(命令.parse_args())

选择属性,如果我们需要用户在已经预设好的目标中选择,即可使用这个属性
在这里插入图片描述

parse_args() 方法

这个方法主要在我们接收调用的时候会用到,比如我们当前想要获取用户输入的等级值,即可使用命令.parse_args().等级,我们也可以通过直接向此方法中传参的方式来达到命令行传参的效果。

命令 = ArgumentParser()
命令.add_argument('-l', dest="等级", type=int, choices=range(1, 4))
print(命令.parse_args(['-l', '1']))
print('当前等级:', 命令.parse_args().等级)

在这里插入图片描述

add_argument_group()分组方法

在使用命令的时候,我们对不同的命令可能需要进行分组,比如必填命令,选填命令之类的。
比如:

命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本", add_help=False)
必填命令 = 命令.add_argument_group('必填命令', '这里的命令是必须填写的')
选填命令 = 命令.add_argument_group('选填命令', '有默认值或非必要信息')
其他命令 = 命令.add_argument_group('其他命令', '本程序相关信息')
其他命令.add_argument('-h', '--帮助', action='help', help='查看帮助信息')
选填命令.add_argument('-a', '--全部', help='开启全部测试(默认开启)', action='store_true')
必填命令.add_argument('-u', '--url', help='目标的URL地址,比如http://127.0.0.1/')
必填命令.add_argument('-t', help='具体要扫描的目标,比如/index(默认:/)', dest="目标")
# %(prog)s: 为当前设置的prog或者程序名称
其他命令.add_argument('-v', '--版本', action='version', help='查看当前版本', version='%(prog)s 0.1 版本')

print(命令.parse_args())

在这里插入图片描述

add_mutually_exclusive_group()互斥组

命令 = ArgumentParser()
互传组 = 命令.add_mutually_exclusive_group()
互传组.add_argument('-t', dest="目标")
互传组.add_argument('-f', dest="文件")
print(命令.parse_args())

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python如果在命令行传参?Python如果获取命令行传入的参数?Python命令行解析器argparse使用详解! ヽ(・ω・´メ) Python库 的相关文章

  • stm32f103——中断——UART中断服务函数

    在程序中 xff0c CPU对外界突发事件进行处理的方式又两种 xff1a 1 轮询系统 xff1a xff08 在main中 xff0c 使用while循环 xff0c 进行循环判断外界事物是否发生 xff09 while xff08 1
  • Docker快速入门,看这个就够了

    Docker快速入门 一 Docker介绍1 1 Docker背景1 2 Docker概念1 3 Docker的优势1 4 Docker的三个基本概念 二 Docker的安装和使用2 1 安装依赖包2 2 安装Docker 三 启动Dock
  • Kubernetes(K8S)集群部署搭建图文教程(最全)

    Kubernetes 集群安装 前期准备集群安装系统初始化Harbor采取私有的仓库去镜像使用集群检测集群功能演示 前期准备 第一步 xff1a Router软路由构建 第二步 xff1a centos7安装 5台 xff08 自行安装 x
  • 【STM32-HAL库】一步步搭建出FOC矢量控制(附C代码)

    说明 本文为无刷电机或PMSM电机驱动的简易代码 xff0c 旨在分享一些个人调试过程的小心得 xff0c 提供一个demo文件 xff0c 程序仍有许多不完善的地方 xff0c 建立起个人的FOC底层驱动 xff0c 可以帮助快速熟悉FO
  • Ubuntu整个系统迁移到其他盘办法

    Ubuntu整个系统迁移到其他盘办法 一 xff1a 制作U盘启动器 xff0c 刻录Ubuntu系统 从U盘引导进入系统 xff0c 点击 xff1a try Ubuntu without install选项 二 xff1a 把需要迁移的
  • 四旋翼无人机飞控系统设计(基础知识篇)

    飞行原理 四旋翼的结构组装有十字模式和X模式之分 xff0c 两者的基本原理一致 xff0c 方向结构不同 xff0c 都是通过四个电机的组合状态进行控制姿态飞行 xff0c 而十字型四旋翼机头是对准其中一个电机的 xff0c X型的四旋翼
  • 大数据组件-Maxwell常用命令(持续更新完善)

    Download Download binary distro https github com zendesk maxwell releases download v1 33 0 maxwell 1 33 0 tar gz Sources
  • 【px4编译】make px4fmu-v3_default upload 不能使用

    今天遇到编译pixhawk2代固件无法upload的问题 xff0c 出现TypeError a bytes like object is required not str xff0c 在1代中是可以make upload的 ninja E
  • 【PX4代码】关于px4代码中timestamp与gps_itow的时间问题

    gps的输出频率为5hz xff0c 由此可见timestamp应该是113248090 1e 6转换为s xff0c 由次可见gps的itow时间应该为271998999 1e 3转换为s 总结 px4中的时间为cpu应该除以10 6 x
  • 【PX4代码】关于ekf2输出频率只有1ohz的问题

    问题 我在使用的是pixhawk 2代 imu的输出频率都在100hz以上 xff0c 使用的gps模块输出频率为5hz xff0c 使用log的local position csv 查看ekf2估计输出的点位信息只有10hz xff0c
  • Keil4中C51的debug调试步骤技巧

    1 选择相应的调试仿真连接器 xff1a 选择 xff1a project gt Options for Target 如下图所示 xff1a 然后在弹出对话框的Debug选项下选择仿真器的型号 xff1a 2 进入调试 xff1a 3 部
  • 怎么操作linux服务器

    Linux 服务器就是采用 Linux 系统的网络服务器 xff0c 同时也有采用 windows 的服务器 xff0c 作用是类似的 而 Linux 并不是一个特定的系统 xff0c 而是使用 Linux 内核的系统 xff0c 现在发行
  • 人工智能如何可以思考?

    近日在给同事讲人工智能的时候 xff0c 提到当数据量不够的时候 xff0c 必要时需要加入人工工程 xff0c 引导计算机 归纳 一些知识 xff0c 毕竟计算机智能比起人类智能 xff0c 最大的缺陷可能在于不懂得 举一反三 换句话说
  • bag文件内topic对应的frame_id查看指令

    启动ROS roscore 运行数据集 span class token comment 数据集小的话 xff0c 建议慢速播放 span rosbag play xxx span class token punctuation span
  • GPS数据类型(ROS)

    文章目录 一 传感器分类二 作用三 系统组成四 位置表示五 数据格式六 ROS中GPS数据格式sensor msgs NavSatFixROS中GPS数据主要包含这四类 xff0c 分别是gps 裸数据ros封装 xff0c 位置 xff0
  • cmake使用教程

    CMakeLists txt文档编写以及packsge xml文档介绍 CMakeLists txt文档一 cmake minimum required命令二 CMake中的编译类型三 cmake编译选项 xff08 与2对应 xff09
  • 四旋翼无人机飞控系统设计(闭环控制系统)

    对于一个简单的飞控程序来说 xff0c 控制器是它最核心的部分 xff0c 这里主要与大家讨论控制系统的基本理论知识 xff08 自控大佬请绕道 xff09 xff0c 包括控制系统概念 闭环控制系统的原理 下篇将侧重包含pid控制算法的具
  • 针对frame_id和child_frame_id的理解

    ros基础必看之各个frame的理解 ROS坐标系统 xff0c 常见的坐标系和其含义 ROS中TF 坐标系转换 原理与使用
  • IMU预积分学习

    IMU预积分学习 一 IMU状态传递方程 一 IMU状态传递方程 几种不同的表达形式 xff1a 1 lio mapping xff1a 参考大佬 xff1a lio mapping 及 VINS Mono代码及理论推导 xff08 2 x
  • Python3 内置模块 - os

    方法名说明os access判断文件权限os chdir改变当前工作目录os chmod file 修改文件权限os execvp 启动一个新进程os execvp 执行外部程序脚本 xff08 Uinx xff09 os fork 获取父

随机推荐