介绍

Python模块argparse,这是一个命令行选项,参数和子命令的解释器,使用该模块可以编写友好的命令行工具,在程序中定义好需要的参数,argparse将弄清楚如何解析 sys.argv中的参数。argparse模块还支持自动生成帮助和用法信息,当模块解析到无效参数时,还可以发出错误。

python标准库sys模块

sys.agv				#命令行参数List,第一个元素时程序本身路径
sys.exit(n) #退出程序,正常退出时exit(0)
sys.version #获取Python解释程序的版本信息
sys.maxint #最大的Int值
sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.stdin #输入线管
sys.stdout #输出相关
sys.stderror #错误相关

命令行工具

我们使用过很多的命令行工具,那么python开发出的命令行工具,能列举出哪些呢?

其实python本身就是一个命令行工具,在cmd中使用python --help,能输出python的帮助语句,这就是命令行工具解析参数后输出的一个例子。

再有,pip 也是一个典型的例子,在使用pip时,不同的子命令可以达成不同的效果。

当然知道和做到相距实在太过遥远,我也很难写出一个python或pip。

概念

argparse是一个较大的模块,提供了很多功能,它的文档相当详细和完整,包含大量示例。所以学习该模块最好的教程就是官方文档,argparse(https://docs.python.org/zh-cn/3/library/argparse.html),那么为什么我没去看呢,一方面是我并不需要复杂的功能,另一方面我的英语阅读能力不足以让我完全理解该文档。我们必须承认,英语水平分开了普通的技术人员,因此我正在努力提升英语水平。

在开发一个命令行工具前,我们首先需要知道一个命令行工具包含了哪些内容,它又是怎么识别我们提供的参数的,识别后又是怎么提供输出的,对待错误的选项,它又是如何调整的。

因此,官网使用了 'ls' 这个命令来介绍命令行工具的几个概念:

  • ls 是一个即使在运行的时候没有提供任何选项,也非常有用的命令。在默认情况下他会输出当前文件夹包括的内容。
  • 如果我们想要使用比它默认提供的更多功能,我们需要告诉该命令更多信息。我们可以指定所谓的位置参数,之所以这样命名,是因为程序应该如何处理该参数值,完全取决于它在命令行出现的文职。更能体现这个概念的命令如 cp ,它最基本的用法是 cp SRC DEST,第一个位置参数指的是你想要复制的,第二个位置参数指的是你想要复制到的位置。
  • 现在假设我们想要改变这个程序的行为。使用 ls -l ,我们可以输出更多的信息,在这个例子中,-l 被称为可选参数。
  • **--help **通常被用来输出帮助文档,它是非常有用的,因为当你遇到一个你从未使用过的程序时,你可以通过阅读它的帮助文档来弄清楚它是如何运行的。

了解了这些,我们通过几个例子可以更好的说明这个模块是如何解析从命令行获取的参数的,并且解析出的参数又是如何被程序使用的。

基础

命令行参数解析很容易,但是它也可以被加入很多参数,注入很多定义,这让最后的程序变得不堪入目,为了防止我的朋友,也就是你,在开始就头痛,我首先带来一个我认为最简单的案例。

示例

所有解析都应当配有示例,并展示对比来说明程序的行为有哪些改变。

argparse使用主要有四个步骤:

  • 导入argparse包
  • 创建 ArgumentParser() 参数对象
  • 调用 add_argument() 方法往参数对象中添加参数
  • 使用 parse_args() 解析添加参数的参数对象,获得解析对象
  • 程序其他部分,当需要使用命令行参数时,使用解析对象.参数获取

在未使用argparse模块前,我编写了这样一个python文件。

print("hello world!")

我们很熟悉这个案例,毫无疑问我们清楚python运行该文件时会得到什么样的输出,当我们在终端运行这个python文件demo1时,我们会使用以下命令。

$ python demo1.py
hello world!

是的,我们看到在命令行中,运行该文件输出了我们想要的结果,一般情况下,我们需要python文件输出某个值时,要么我们将该值在文件中写死,就像上面这个例子一样,我们已经在文件中将想要的输出写死在文件中,这个值在未被输出时就已经在程序中被决定。如果我们需要用户在终端中向程序提供某些值,来改变程序的行为,得到不同的输出,我们常用的手段是使用input,让程序读入终端的输入来达到这样的效果。不过这样做仍然需要手动的输入,如果是自动化程序,那么可以使用参数直接带入需要的变量将大大减少这样的交互。

接下来我将演示如何使用argparse来完成一个简单的参数解析。

import argparse #导入argparse包

parse = argparse.ArgumentParser() #创建参数对象
parse.add_argument('hello') #向参数对象中添加参数
args = parse.parse_args() #解析参数对象获得解析对象
if __name__ == '__main__':
print(args.hello)

让我们来运行一下这个程序

$ python demo1.py helloworld
helloworld

很简单,这是一个容易的例子,需要注意的是,由于没有指定,所以命令行参数输入默认按顺序复制,顺序不同的话得到的结果将不同。

接下来我将带入一些官网上的案例,来继续解释argparse的一些进阶示例。

使用介绍

  • --help 选项,也可缩写为 -h,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。指定任何内容都会导致错误。即便如此,我们也能直接得到一条有用的用法信息。

add_argument()方法,定义如何解析命令行参数,对于该方法,参数解释如下:

  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
  • action - 命令行遇到参数时的动作,默认值是 store。
    • store_const,表示赋值为const;
  • – append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
  • – append_const,将参数规范中定义的一个值保存到一个列表;
  • – count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
  • nargs - 应该读取的命令行参数个数,可以是
  • 具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const
  • 或者是 * 号,表示 0 或多个参数;
  • 或者是 + 号表示 1 或多个参数。
  • const - action 和 nargs 所需要的常量值。
  • default - 不指定参数时的默认值。
  • type - 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 可选参数是否可以省略 (仅针对可选参数)。
  • help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
  • metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
  • dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

可选参数设置

通过在参数名前加 --, 设置为可选参数,如果未输入,则使用default默认值,若为设置default则默认赋值 None

parse.add_argument('-n', '--name', type=str, metavar='name', help='New flavor name')

引用名,可以缩短参数名,简化命令行参数输入;也就是使用-n或者-name可以获得一样的效果

必选参数设置

需要一个必选参数时,则设置required=True,这时,无论参数是否时可选参数,都必须输入

列表参数传入设置

添加narg='+' 这样可以在命令行中添加若干个参数,传入后将被添加到列表中。

互斥参数

也就是add_mutually_exclusive_group方法,这让我们可以添加两个互相排斥的参数,也就是只能选择其中一个参数添加

默认参数设置

set_defaults()可以设置一些参数的默认值

python开发简单的命令行工具的更多相关文章

  1. 【Nodejs】326- 从零开发一个node命令行工具

    本文由 IMWeb 社区授权转载自腾讯内部 KM 论坛.点击阅读原文查看 IMWeb 社区更多精彩文章. 什么是命令行工具? 命令行工具(Cmmand Line Interface)简称cli,顾名思 ...

  2. 将Python模块转变为命令行工具

    问:如何输入命令行就能执行python代码呢? 答:要将python模块转变为命令行工具只用在 setup.py 文件中添加参数entry_points 例如: entry_points={ 'con ...

  3. python笔记42-http请求命令行工具(httpie)

    前言 通常我们需要快速的测试某个接口通不通,一般linux上用curl去发http请求,但是这个命令行工具语法有点复杂了,不够直观. python有一个给人类使用的requests库,非常的简单方便. ...

  4. Github获8300星!用Python开发的一个命令行的网易云音乐

    最近在逛Github发现了一个非常有趣的库musicbox,是用纯Python打造的,收获了8300颗星.Python语言简单易学,好玩有趣,身边越来越多的小伙伴都开始学习Python.她的魅力非常大 ...

  5. Python磁力获取器命令行工具 torrent-cli

    作为一个搞代码的,找资源这种事肯定不能像普通人一样打开百度盲目查找,你需要写个爬虫工具来帮你完成这件事情啦! 兼容环境 Windows/Linux/MacOs 安装 pip 安装 $ pip inst ...

  6. python制作命令行工具——fire

    python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...

  7. 从零开始打造个人专属命令行工具集——yargs完全指南

    前言 使用命令行程序对程序员来说很常见,就算是前端工程师或者开发gui的,也需要使用命令行来编译程序或者打包程序 熟练使用命令行工具能极大的提高开发效率,linux自带的命令行工具都非常的有用,但是这 ...

  8. iOS系统提供开发环境下命令行编译工具:xcodebuild

    iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单 ...

  9. Apache Commons CLI 开发命令行工具示例

    概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...

  10. [原创]使用命令行工具提升cocos2d-x开发效率(一)之TexturePacker篇

    TexturePacker是一个常用的制作sprite sheet的工具,它提供了很多实用的功能. 一般我们制作sprite sheet都是使用他的gui版本,纯手工操作,就像下面这张图示的一样. 刚 ...

随机推荐

  1. 使用 Cravatar 解决 Gravatar 头像无法访问的问题

    Gravatar全球通用头像服务 1.基本介绍 Gravatar,即全球公认的头像,是一项免费的头像服务,适用于网站所有者,开发人员以及任何想要轻松且经过验证的在线身份的人.它被内置在每个WordPr ...

  2. Oracle性能优化之内存管理

    Oracle实例中的内存使用分为两类:程序全局区(program global area, PGA)和系统全局区(system global area, SGA).前者专门供每个会话使用,后者由所有O ...

  3. 聊聊mysql的事务

    今天来聊聊事务的四大特性以及其实现原理,需结合之前写的mysql是如何实现mvcc的来理解,因为大多数的实现都是基于mvcc的,理论介绍完后会通过实例来演示mvcc又是如何实现这些隔离级别的 事务的四 ...

  4. 解决Halcon转C#时,图像显示的问题

    不知道大家在使用Halcon进行图像处理,由于要连续处理多张图片,转为C#代码的时候,使用了Halcon控件显示图像,但是运行的时候,中间的其他图片没有显示在控件上,之前我一直以为是运行速度快导致看不 ...

  5. vue3路由的使用

    一.路由的概要 1.1.什么是路由? 路由就是一组映射关系,根据不同的 url 地址展示不同的内容或页面(key-value): key为路径,value可能是function或component 路 ...

  6. 2022春每日一题:Day 26

    题目:无聊的数列 区间增加等差序列,似乎不好维护,等差等差,那就差分呗,单点查询,更加肯定,直接差分,每次加了一个等差序列容易发现只需要对应的差分数组a[l]+=k,a[l+1]...a[r]+=d, ...

  7. npm安装hexo报错

    报错提示 npm WARN saveError ENOENT: no such file or directory, open '/home/linux1/package.json' npm noti ...

  8. 微信公众号没有scope授权

    微信公众号有自己的appid 开发平台的绑定也有自己的appid 看文档的时候,注意是使用公众号的appi还是开放平台的appid

  9. Day18.2:对象创建的内存分析图解

    对象创建的内存分析 我们从两块最常用的内存空间对对象创建进行内存分析 堆内存:存放的是对象的具体信息:在程序之中堆内存空间的开辟是通过new完成的 栈内存:存放的是对象的地址信息,即通过地址找到堆内存 ...

  10. 腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务

    大数据时代,数据库 SaaS 是企业实现降本增效和业务创新的重要抓手.在腾讯全球数字生态大会数据库 SaaS 专场上,腾讯云发布了多项数据库 SaaS 产品能力升级,并重点分享了其在上云.日常运维.数 ...