Python的命令行参数解析

命令行参数解析在编程语言中基本都会碰到,Python中内置了一个用于命令项选项与参数解析的模块argparse。下面主要介绍两种解析Python命令行参数的方式。

1. sys.argv

解析Python中命令行参数的最传统的方法是通过sys.argv。Demo如下:

#!/usr/env/python python
# _*_ coding: utf-8 _*_

import sys

param1 = sys.argv[1]
param2 = sys.argv[2]

print sys.argv
print param1
print param2
print type(param1)
print type(param2)

测试结果如下:

$ python test.py 1 2
['test.py', '1', '2']
1
2

这种方法比较古老,灵活性很差,同时解析出来的参数都是str类型。但在编写简单脚本,参数较少且固定时比较方便。

2. argparse

argparse模块是Python内置的参数解析模块,使用起来比较简单且功能强大。Demo如下:

#!/usr/env/python python
# _*_ coding: utf-8 _*_

import argparse

# Create ArgumentParser() object
parser = argparse.ArgumentParser()

# Add argument
parser.add_argument('--train', required=True, help='path to dataset')
parser.add_argument('--val', required=True, help='path to dataset')
parser.add_argument('--total', type=int, help='number of dataset', default=100)
parser.add_argument('--lr', type=float, default=0.01, help='learning rate')

# Print usage
parser.print_help()

# Parse argument
args = parser.parse_args()

# Print args
print args

print args.train
print type(args.train)
print args.val
print type(args.val)
print args.total
print type(args.total)
print args.lr
print type(args.lr)

测试结果如下:

# Test 1
python test.py --train train_lmdb --val val_lmdb --total 10000 --lr 0.001
usage: test.py [-h] --train TRAIN --val VAL [--total TOTAL] [--lr LR]

optional arguments:
  -h, --help     show this help message and exit
  --train TRAIN  path to dataset
  --val VAL      path to dataset
  --total TOTAL  number of dataset
  --lr LR        learning rate
Namespace(lr=0.001, total=10000, train='train_lmdb', val='val_lmdb')
train_lmdb
<type 'str'>
val_lmdb
<type 'str'>
10000
<type 'int'>
0.001
<type 'float'>

# Test 2
python test.py --train train_lmdb --val val_lmdb
usage: test.py [-h] --train TRAIN --val VAL [--total TOTAL] [--lr LR]

optional arguments:
  -h, --help     show this help message and exit
  --train TRAIN  path to dataset
  --val VAL      path to dataset
  --total TOTAL  number of dataset
  --lr LR        learning rate
Namespace(lr=0.01, total=100, train='train_lmdb', val='val_lmdb')
train_lmdb
<type 'str'>
val_lmdb
<type 'str'>
100
<type 'int'>
0.01
<type 'float'>


# Test 3
python test.py --val val_lmdb --train train_lmdb
usage: test.py [-h] --train TRAIN --val VAL [--total TOTAL] [--lr LR]

optional arguments:
  -h, --help     show this help message and exit
  --train TRAIN  path to dataset
  --val VAL      path to dataset
  --total TOTAL  number of dataset
  --lr LR        learning rate
Namespace(lr=0.01, total=100, train='train_lmdb', val='val_lmdb')
train_lmdb
<type 'str'>
val_lmdb
<type 'str'>
100
<type 'int'>
0.01
<type 'float'>

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)

add_argument函数的参数如下:

  • name or flags - 选项字符串的名字或者列表,例如foo 或者-f, –foo。
  • action - 在命令行遇到该参数时采取的基本动作类型。
  • nargs - 应该读取的命令行参数数目。
  • const - 某些action和nargs选项要求的常数值。
  • default - 如果命令行中没有出现该参数时的默认值。
  • type - 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 该命令行选项是否可以省略(只针对可选参数)。
  • help - 参数的简短描述。
  • metavar - 参数在帮助信息中的名字。
  • dest - 给parse_args()返回的对象要添加的属性名称。

参考资料:

  1. http://python.usyiyi.cn/translate/python_278/library/argparse.html
  2. http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏视觉求索无尽也

【Python】Python知识点总结

字典{key:value,key:value},dict(key=value,key=value):

1131
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——6,删除列表元素

这个时候我们CET考完了,怎么才能把它删除呢。这时候我们可以用del这个函数,用法如下: del exam[0] print(exam) #print的作用...

3488
来自专栏PHP在线

PHP 简短而安全的数组遍历

但是其实这样会引起一个重要的问题:如果 $definition['keys'] 没有定义的话,这个时候的数组变量(也就是 foreach)就会出现错误。

952
来自专栏Golang语言社区

第三节:Go语言基础语法

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

1230
来自专栏编程坑太多

Python模块time和random

1374
来自专栏积累沉淀

Python快速学习第十天

11.1 打开文件 open函数用来打开文件,语法如下: open(name[, mode[, buffering]]) open函数使用一个文件名作为唯...

1796
来自专栏吴柯的运维笔记

几个简单的python脚本编写

编写固定输出的斐波那契数列 # vim fibs.py #!/usr/bin/python fibs = [0, 1] for i in range(8): ...

2717
来自专栏开源优测

JMeter函数和变量11

前言 在jmeter中提供了功能强大的内置函数来帮助我们处理字符串、文件读写、计算、运行外部脚本等等能力。 要想在项目中切实运用来jmeter完成复杂的压测场景...

3586
来自专栏IT派

Python的22个编程技巧,简化 if 语句、开启文件分享……

Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:

1122
来自专栏Core Net

一个插排引发的设计思想 (三) 委托与事件

2648

扫码关注云+社区