详解Python命令行解析工具Argparse


Posted in Python onApril 20, 2016

最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具。

以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题,尤其是vc++中尤其繁琐。

现在用python来实现命令行,核心计算模块可以用c自己写扩展库,效果挺好。

学习了argparse,在官方文档中找到一篇toturial,简单翻译了下。

http://docs.python.org/2/howto/argparse.html#id1

Argparse Tutorial
这篇教程简明地介绍了Python标准库推荐使用的命令行参数解析模块——Argparse的使用。

1、基本概念

 在这篇教程中我们通过一个常见的ls命令来展示argparse的功能。

$ ls
cpython devguide prog.py pypy rm-unused-function.patch
$ ls pypy
ctypes_configure demo dotviewer include lib_pypy lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide
-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy
-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

从以上的四个命令中,我们能够了解以下几个基本概念:

1)、ls命令在没有参数的情况下也是可以运行的,默认打印出当前目录下的所有内容。
2)、如果我们想让它展示更多内容,那么我们需要给它多一点参数。在这种情况下,我们想显示一个不同的目录,pypy。我们所做的就是明确了常见的定位参数(positional argument),这样命名是因为需要程序根据参数在命令行中的位置而决定做什么。这个概念与命令cp更为接近,它的用法是cp src dest,src表示的是你想要拷贝的文件,dest表示你想要将文件拷贝到哪里。
3)、现在,我想要改变程序的行为。在我们的例子中,我想显示文件的向西信息而不仅仅是文件名,参数-l 则是我们所知道的可选参数(optinal argument)
4)、最后一句是显示帮助的文档的一个片段,当你遇到你从未使用过的命令时,你可以通过它学习怎么使用。

2、基本认识

我们从一个基本的程序开始(它什么也不做)

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

运行结果:

$ python prog.py
$ python prog.py --help
usage: prog.py [-h]

optional arguments:
 -h, --help show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo

结果分析:

1)、若不给参数而运行这个程序,将不会得到任何结果。
2)、第二条命名显示了使用的argparse的好处,你什么也没做,却得到了一个很好的帮助信息。
3)、我们无需人为设置--help参数,就能得到一个良好的帮助信息。但是若给其他参数(比如foo)就会产生一个错误。

3、位置参数

首先,给一个例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo

运行结果:

$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo

positional arguments:
 echo

optional arguments:
 -h, --help show this help message and exit
$ python prog.py foo
foo

结果分析:

这次,我们增加了一个add_argument()方法,用来设置程序可接受的命令行参数。
现在要运行程序,就必须设置一个参数。
parse_args()方法实际上从我们的命令行参数中返回了一些数据,在上面的例子中是echo
这个像“魔法”一样的过程,是argparse自动完成的。
尽管自动产生的帮助信息展示地很美观,但是我们仍然无法只根据echo这个参数知道它是做什么的。所以,我们增加了一些东西,使得它变得更有用。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print args.echo

运行结果:

$ python prog.py -h
usage: prog.py [-h] echo

positional arguments:
 echo    echo the string you use here

optional arguments:
 -h, --help show this help message and exit

在此基础上,我们再多改变一点:(计算输入参数square的平方)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print args.square**2

下面是运行结果:

$ python prog.py 4
Traceback (most recent call last):
 File "prog.py", line 5, in <module>
  print args.square**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

这个程序并不能正确运行,因为argparse会将输入当作字符串处理,所以我们需要设置它的类型:(type=int)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
          type=int)
args = parser.parse_args()
print args.square**2

下面是运行结果:

$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'

现在,这个程序能够顺利运行,而且能够处理一些错误输入。

以上就是关于Python命令行解析工具Argparse的简单使用教程,希望对大家有帮助。

Python 相关文章推荐
python服务器端收发请求的实现代码
Sep 29 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
详解Python使用tensorflow入门指南
Feb 09 Python
Numpy掩码式数组详解
Apr 17 Python
python实现反转部分单向链表
Sep 27 Python
python自动化之Ansible的安装教程
Jun 13 Python
详解Django admin高级用法
Nov 06 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
keras 如何保存最佳的训练模型
May 25 Python
利用Python如何生成随机密码
Apr 20 #Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 #Python
python实现简单socket通信的方法
Apr 19 #Python
python实现域名系统(DNS)正向查询的方法
Apr 19 #Python
python安装与使用redis的方法
Apr 19 #Python
Python实现文件复制删除
Apr 19 #Python
利用Python获取赶集网招聘信息前篇
Apr 18 #Python
You might like
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python使用urlparse分析网址中域名的方法
2015/04/15 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
python测试mysql写入性能完整实例
2018/01/18 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
英语专业自荐书
2014/06/13 职场文书
道德模范事迹材料
2014/12/20 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
心灵捕手观后感
2015/06/02 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
MySQL Server 层四个日志
2022/03/31 MySQL