命令行解析
命令行解析的方法有4种(我遇到的)
-
sys.argv
-
tensorflow.app
-
optparse
-
argparse
1 sys.argv
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白。因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。
下面我们通过一个极简单的test.py程序的运行结果来说明它的用法。
1 #test.py 2 3 import sys 4 a=sys.argv[0] 5 print(a)
将test.py保存在c盘的根目录下。
在程序中找到 ‘运行’->点击->输入"cmd"->回车键 进入控制台命令窗口(如下图),先输入cd c:\ (作用是将命令路径改到c盘根目录),然后输入test.py运行我们刚刚写的程序:
得到的结果是C:\test.py,这就是0指代码(即此.py程序)本身的意思。
然后我们将代码中0改为1 :
a=sys.argv[1]https://www.cnblogs.com/liangmingshen/p/8906148.html
保存后,再从控制台窗口运行,这次我们加上一个参数,输入:test.py what
得到的结果就是我们输入的参数what,看到这里你是不是开始明白了呢。
那我们再把代码修改一下:
a=sys.argv[2:]
保存后,再从控制台窗台运行程序,这次多加几个参数,以空格隔开:
test.py a b c d e f
得到的结果为[‘b’, ’c’, ’d’, ’e’, ’f’]
应该大彻大悟了吧。Sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该 将程序保存了,从外部来运行程序并给出参数。
2 tensorflow.app
参考 : https://blog.csdn.net/leiting_imecas/article/details/72367937
tf定义了tf.app.flags,用于支持接受命令行传递参数,相当于接受argv。
import tensorflow as tf
#第一个是参数名称,第二个参数是默认值,第三个是参数描述
tf.app.flags.DEFINE_string('str_name', 'def_v_1',"descrip1")
tf.app.flags.DEFINE_integer('int_name', 10,"descript2")
tf.app.flags.DEFINE_boolean('bool_name', False, "descript3")
FLAGS = tf.app.flags.FLAGS
#必须带参数,否则:'TypeError: main() takes no arguments (1 given)'; main的参数名随意定义,无要求
def main(_):
print(FLAGS.str_name)
print(FLAGS.int_name)
print(FLAGS.bool_name)
if __name__ == '__main__':
tf.app.run() #执行main函数
if.app.run(main=main)# 也可这么写
执行:
[aaa@qq.com test]# python tt.py
def_v_1
10
False
[aaa@qq.com test]# python tt.py --str_name test_str --int_name 99 --bool_name True
test_str
99
True
3 optparse
一、关于解析命令行参数的方法
关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块。关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考:https://www.cnblogs.com/aland-1415/p/6613449.html
这里为大家介绍一个比sys.argv更强大的optparse模块。
这里说一句题外话,点开optparse的源码,第一行注释是这样的:A powerful, extensible, and easy-to-use option parser。是否感受到了作者强有力的......
说回正题。当我们要利用server与client进行FTP文件传输的时候,在client端往往需要输入诸如 -s 10.10.10.1 -p 9001 这样的信息,当然我们不能控制用户的输入,如果用户随意的输入错误的命令,比如不写IP地址,只是写-s -p 9001,或者只写 -s -p。我们如果还用sys.argv获取参数的话需要做很多麻烦的逻辑判断,这给我们开发程序带来了很大的不便。
但是如果我们利用optparse会十分便捷的解决这样的问题。
二、optparse介绍
2.1 optparse的用法如下:
import optparse
parser = optparse.OptionParser()
parser.add_option("-s", "--server", dest="server", help="ftp server ip_address")
parser.add_option("-P", "--port", type="int", dest="port", help="ftp server port")
parser.add_option("-u", "--username", dest="username", help="username info")
parser.add_option("-p", "--password", dest="password", help="password info")
首先import optparse类,然后创建optparse对象parser,再使用add_option()来定义命令行参数,最后使用parse_args()来解析命令行。
2.2 举例说明:
我们先新建一个test.py文件,代码如下
import optparse
class Wang_opt:
def __init__(self):
#初始化
parser = optparse.OptionParser()
parser.add_option("-s", "--server", dest="server", help="ftp server ip_address")
parser.add_option("-P", "--port", type="int", dest="port", help="ftp server port")
parser.add_option("-u", "--username", dest="username", help="username info")
parser.add_option("-p", "--password", dest="password", help="password info")
#解析参数
self.options, self.args = parser.parse_args()
print(self.options,self.args)
if __name__ == '__main__':
whw_opt = Wang_opt()
然后在test.py文件的目录下运行python test.py,后面不跟任何参数,看看效果:
运行的结果一个是”字典”,里面存放的是我们需要的信息,后面有一个“空列表”,我们再试试加上符合条件的参数以及不符合条件的参数:
这就说明,”字典”中存放的是我们需要的信息,如果用户没有输入默认设置为None;而“列表”’中存放的是“错误”信息。再返回头看看源代码,其实这个”字典”就是上面的self.options变量,“列表”就是self.args。optparse模块解析的结果就是“我们想得到的信息”以及“用户误操作的输入信息”——的确很强大!
当然,如果用户不知道他需要输入什么命令,我们可以在后面输入 -h,寻求帮助:
其实大家可以对照着源代码,这些信息的关键字都是我们在add_option()方法中设置的——嗯,确实~A powerful, extensible, and easy-to-use option parser
三、重点说明
3.1 关于得到的“字典”与“列表”的说明:
其实我们解析得到的参数self.options与 self.args并不是真正意义上的字典与列表,只是“字典与列表的形象”而已!实际上,这两个参数是“对象”,我们可以进行如下验证:在程序最后打印:
print(whw_opt.options.server)
我们可以看到:用操作符‘.’可以取得server的值 0.0.0.0。
但是,我们如果利用字典的key-value的取值方式会报错:
3.2 一个小优化:
当然,再厉害的工具也必然会有缺点。如果要求用户必须有输入的话,我们可以这样来优化一下程序:
import optparse
class Wang_opt:
def __init__(self):
#初始化
parser = optparse.OptionParser()
parser.add_option("-s", "--server", dest="server", help="ftp server ip_address")
parser.add_option("-P", "--port", type="int", dest="port", help="ftp server port")
parser.add_option("-u", "--username", dest="username", help="username info")
parser.add_option("-p", "--password", dest="password", help="password info")
#解析参数
self.options, self.args = parser.parse_args()
print(self.options,self.args)
def veargparserification(self):
if not self.options.server or not self.options.port:
exit('ERROR!must support server and port parameters!')
if __name__ == '__main__':
whw_opt = Wang_opt()
whw_opt.verification()
效果如下:
4 argparse
参考 : https://blog.csdn.net/yy_diego/article/details/82851661
argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。他的用法和tf.app有点像。
1.基本框架
下面是采用argparse从命令行获取用户名,该python的文件名为:fun_test.py
import argparse
def main():
parser = argparse.ArgumentParser(description="Demo of argparse")
parser.add_argument('-n','--name', default=' Li ')
parser.add_argument('-y','--year', default='20')
args = parser.parse_args()
print(args)
name = args.name
year = args.year
print('Hello {} {}'.format(name,year))
if __name__ == '__main__':
main()
执行命令python fun_test.py结果如下:
在这里插入图片描述
在上面的代码中,我们先导入了argparse这个包,然后包中的ArgumentParser类生成一个parser对象(好多博客中把这个叫做参数解析器),其中的description描述这个参数解析器是干什么的,当我们在命令行显示帮助信息的时候会看到description描述的信息。
接着我们通过对象的add_argument函数来增加参数。这里我们增加了两个参数name和year,其中'-n','--name'表示同一个参数,default参数表示我们在运行命令时若没有提供参数,程序会将此值当做参数值。执行结果如上图所示。
最后采用对象的parse_args获取解析的参数,由上图可以看到,Namespace中有两个属性(也叫成员)这里要注意个问题,当'-'和'--'同时出现的时候,系统默认后者为参数名,前者不是,但是在命令行输入的时候没有这个区分接下来就是打印参数信息了。
当执行命令python fun_test.py -n Wang --year '26'结果如下:
在这里插入图片描述
当执行命令python fun_test.py -h可以查看帮助信息
在这里插入图片描述
更多参数介绍可以参看这个链接
上一篇: LintCode 题目:找数字