A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 易大帅 高级黑马   /  2017-3-17 11:46  /  2435 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


python Argparse 模块入门(tuxl_c_s_d_n)

argparse是python标准库里面的用来处理命令行参数的库
位置参数和选项参数

先了解位置参数和选项参数的概念,以linux中’ls’命令为例

[root@openstack_1 /]# ls
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
[root@openstack_1 /]# ls root/
anaconda-ks.cfg  devstack  index.html  install.log  install.log.syslog
[root@openstack_1 /]# ls -l
总用量 86
dr-xr-xr-x.   2 root root  4096 4月   1 22:42 bin
dr-xr-xr-x.   5 root root  1024 4月   1 22:43 boot
drwxr-xr-x.  18 root root  3880 4月   6 15:24 dev
drwxr-xr-x.  77 root root  4096 4月   6 15:24 etc
drwxr-xr-x.   3 root root  4096 4月   2 20:50 home
dr-xr-xr-x.  15 root root 12288 4月   1 22:42 lib
drwx------.   2 root root 16384 3月  26 20:59 lost+found
drwxr-xr-x.   2 root root  4096 9月  23 2011 media
drwxr-xr-x.   2 root root  4096 9月  23 2011 mnt
drwxr-xr-x.   3 root root  4096 4月   2 21:03 opt
dr-xr-xr-x. 128 root root     0 4月   6 2015 proc
dr-xr-x---.   5 root root  4096 4月   2 21:05 root
dr-xr-xr-x.   2 root root 12288 4月   1 22:42 sbin
drwxr-xr-x.   7 root root     0 4月   6 2015 selinux
drwxr-xr-x.   2 root root  4096 9月  23 2011 srv
drwxr-xr-x.  13 root root     0 4月   6 2015 sys
drwxrwxrwt.   3 root root  4096 4月   6 15:24 tmp
drwxr-xr-x.  12 root root  4096 3月  26 21:03 usr
drwxr-xr-x.  18 root root  4096 3月  26 21:04 var

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

第一次调用ls没有使用参数 第二次调用使用了’root/’作为参数 第三次调用使用了 ‘-l’ 选项 其中 ‘root/’是代表的位置参数 而’-l’是选项参数。所谓位置参数就是程序根据该参数出现的位置来确定其意义,比如上上面的例子中 可以是’root/’ 也可以是’bin/’ 等等 二:选项参数是应用程序已经设提前定义好的参数,比如’-l’就是 ls 命令的一个选项 用户在使用选项参数是 必须要使用命令定义好的选项参数,而不是自己随意指定。
使用示例

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

    1
    2
    3

执行脚本

$python main.py

$python main.py -h
usage: main.py [-h]

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

    1
    2
    3
    4
    5
    6
    7

上面的代码中 第一次执行 没有加参数 不输出任何内容
的二次执行 加上 -h参数 则输出 帮助信息
上面的例子中对程序的描述比较简单,可以自己加上对程序的描述信息

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.parse_args()

    1
    2
    3

$ python main.py -h
usage: main.py [-h]

say something about this application !!

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

    1
    2
    3
    4
    5
    6
    7

对比之前的输出 可以看到多出了一句话 ,这一句话就是在argparse.ArgumentParser()函数中新加的参数

好了 现在准备给应用程序增加参数了,先说位置参数

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument('name')
parser.parse_args()

    1
    2
    3
    4

$python main.py
usage: main.py [-h] name
main.py: error: too few arguments

    1
    2
    3

我们在程序程序中设置了一个位置参数’name’ 这样的话 在运行程序时就需要指定一个位置参数 否则就会像上面那样报错

$python main.py taylor

    1
    2

运行正确 下面增加 -h选项 查看帮助文档

$python main.py taylor -h
usage: main.py [-h] name

say something about this application !!

positional arguments:
  name

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

对比之前的输出 发现多了一个 positional arguments: 帮助项 并且有一个name字段 表示这个程序需要指定一个name的位置参数。那么现在你可能想要告诉程序的使用者这个name参数怎么用。想要实现这个功能 只需要按照下面的方式来修改

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument('name',  help="i can tell you how to set a name argument")
parser.parse_args()

    1
    2
    3
    4

$python main.py taylor -h
usage: main.py [-h] name

say something about this application !!

positional arguments:
  name        i can tell you how to set a name argument

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

可以看到name字段已经多了一个关于该字段的描述

好了现在可以考虑获取用户传入的值了

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument('name',  help="i can tell you how to set a name argument")
result = parser.parse_args()

print(result.name)

    1
    2
    3
    4
    5
    6

$python main.py taylor
taylor

    1
    2

对比程序和输出结果 发现我们已经得到了用户输入的值。注意,python获取的值默认都是字符串类型的,无论用户输入的是数字还是字符串。考虑下面的程序

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument('name',  help="i can tell you how to set a name argument")
result = parser.parse_args()

print(type(result.name))

    1
    2
    3
    4
    5
    6

$python main.py taylor
<type 'str'>
$python main.py 123456
<type 'str'>

    1
    2
    3
    4

由上面比较可知, 无论用户输入数字还是字符串 在python的返回中都是字符串类型的,如果需要作为其他类型变量来使用,那么需要先转换成相应的类型,比如 用int(xx)转换成整数。如果需要指定用户类必须输入某种类型, 那么可以这样做:

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument('name', type=int,  help="i can tell you how to set a name argument")
result = parser.parse_args()
print(result.name)
print(type(result.name))

    1
    2
    3
    4
    5
    6

$python main.py taylor
usage: main.py [-h] name
main.py: error: argument name: invalid int value: 'taylor'
$python main.py 123456
123456
<type 'int'>

    1
    2
    3
    4
    5
    6

对比上面的程序和运行结果 可知 当指定了参数类型, 当用户传入了一个错误类型的参数 程序会报错退出 否则程序正常执行 并且将结果转换成相应的数据类型
使用选项参数

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument("--age", help="this is an optional argument")
result = parser.parse_args()
print(result.age)

    1
    2
    3
    4
    5

$python main.py -h
usage: main.py [-h] [--optional OPTIONAL]

say something about this application !!

optional arguments:
  -h, --help           show this help message and exit
  --age OPTIONAL  this is an optional argument

    1
    2
    3
    4
    5
    6
    7
    8

帮助输出包含了对age选项的说明

$python main.py  --age
usage: main.py [-h] [--optional OPTIONAL]
main.py: error: argument --age: expected one argument

    1
    2
    3

只指定了age选项 但是没有制定该选项的值 则会报错

$python main.py  --age 888
888
$python main.py  --age=888
888

    1
    2
    3
    4

指定age的值为888 在程序中可以获取到输入值

$python main.py
None

    1
    2

如果选项参数 不指定值 那么 默认获取到的值是None

可以给选项参数设置简称 比如

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument("-a","--age", help="this is an optional argument")
result = parser.parse_args()
print(result.age)

    1
    2
    3
    4
    5

$python main.py  -a 888
888

    1
    2

可以向上面那样使用短标签
当然有时候一个选项参数只是作为一个开关的作用,而不需要指定具体的值, 如果使用了该选项则表示打开某个功能,否则表示关闭。

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument("-a", "--age", help="this is an optional argument", action="store_true")
result = parser.parse_args()
print(result.age)

    1
    2
    3
    4
    5

$python main.py  -a 888
usage: main.py [-h] [-a]
main.py: error: argument -a/--age: ignored explicit argument '888'

    1
    2
    3

如果此时给-a选项指定参数值,则会导致程序报错

$python main.py  -a
True

    1
    2

指定了选项 则为true

$python main.py
False

    1
    2

没使用选项 则为False

也可以指定选项值为指定列表中的值

import argparse
parser = argparse.ArgumentParser(description="say something about this application !!")
parser.add_argument("-a", "--age", help="this is an optional argument", type=int, choices=[0, 1, 2])
result = parser.parse_args()
print(result.age)

    1
    2
    3
    4
    5

在程序中 指定了 age 参数类型为int 并且只能是0,1,2三个数中的其中一个

$python main.py -a 2
2

    1
    2

使用2作为参数值则正确输出

$python main.py -a 5
usage: main.py [-h] [-a {0,1,2}]
main.py: error: argument -a/--age: invalid choice: 5 (choose from 0, 1, 2)

    1
    2
    3

使用5作为参数值 因为5不在指定的列表当中 所以会导致报错
查看原文>> 0
看过本文的人也看了:

    Python知识结构图
    python 安装pip、.whl格式的文件
    Python-开发之路-模块
    Python:itertools模块
    [python学习] 模仿浏览器下载CSDN源文...
    Python 图形处理库PIL批量修改图片大...

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马