python命令行解析

在写Python代码的时候,需要传入一些参数,可以灵活的指定,而不是在代码里面写死。

比如:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument( 
    '--flag_int', 
    type=float, 
    default=0.01, 
    help='flag_int.' 
) 
FLAGS, unparsed = parser.parse_known_args() 
print(FLAGS) 
print(unparsed)
命令窗口输入:$ python prog.py --flag_int 0.02 --double 0.03 a 1
运行结果如下:
 Namespace(flag_int=0.02)
['--double', '0.03', 'a', '1']

==============分析代码======================================

在python中,命令行解析的很好用,

1.首先导入命令行解析模块

import argparse
import sys

2.然后创建对象

parse=argparse.ArgumentParser()

3.然后增加命令行

parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate")

对于函数add_argumen()第一个是参数别名,在终端时候要输入别名,以及对应的值。第二个是数据类型,第三个默认值,当你没有在终端输入参数的值,会用默认的值。第四个是help命令时的说明,帮你理解参数的作用。

还有一些其他可选参数,比如当 --verbosity 被修改时,这个程序就会输出一些东西,如果没有修改,那么不输出任何东西。

程序里面加了一个新的参数 action,并把它取值为 store_true 。也就是说如果这个选项 --verbose 被修改了,那么我们就给它赋值为 True,如果没有被修改,那么就是 False。当你修改这个值的时候,实际上,不管你指定的是什么,它都会被赋值为 True

4.parse_known_args()就很有用。它很像parse_args().

我们先讲一下调用parse_args()方法进行解析;解析成功之后即可使用。

比如:

def parse_args():

    parser = argparse.ArgumentParser() 

     help = The addresses to connect. parser.add_argument('addresses',nargs = '*',help = help)

     help = The filename to operate on.Default is poetry/ecstasy.txt parser.add_argument('filename',help=help) 

     args = parser.parse_args(); 

     return args

 if __name__ == '__main__':

     args = parse_args()

      print 'The filename is : %s .' % args.filename

     print 'The port is : %d.' % args.port

======================================但是

args = parser.parse_args()换成 FLAGS, unparsed = parser.parse_known_args()

print(FLAGS) 

print(unparsed)

命令窗口输入:$ python prog.py --flag_int 0.02 --double 0.03 a 1运行结果如下:

Namespace(flag_int=0.02)

['--double', '0.03', 'a', '1']parser.parse_known_args()

它在接受到多余的命令行参数时不报错。相反的,返回一个tuple类型的命名空间保存在FLAGS和一个保存着余下的命令行字符的list在unparsed。

====================下面给个完整一点的代码作为参考

import argparse
import os
FLAGS=None
def main():
    if tf.gfile.Exists(FLAGS.log_dir):
        tf.gfile.Delete_Recursively(FLAGS.log_dir)
    tf.gfile.MakeDirs(FLAGS.log_dir)
    
if __name__=='__main__':
    parser=argparse.ArgumentParser()
   
    parser.add_argument('--log_dir',type=str,default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),'tensorflow/mnist/logs/fully_connected_feed'),help='Directory to put the log data.')
    parser.add_argument('--fake_data',default=False,help='If true, uses fake data for unit testing.',action='store_true')
    
    FLAGS,unparsed=parser.parse_know_args()
    tf.app.run(main=main,argv=[sys.argv[0]]+unparsed)

argc 是 argument count的缩写,表示传入main函数的参数个数;

argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;我们有时候这样写:

用arg=parse.parse_args(sys.argv[1:]),sys.argv[1:]来获取真正的第一个参数值.


总结:

使用步骤:

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args() or  FLAGS,unparsed=parser.parse_know_args()



参考:

https://www.jianshu.com/p/e8010e85aeb3

https://blog.csdn.net/mameng1/article/details/54409910

https://www.cnblogs.com/xlqtlhx/p/8243592.html

https://www.2cto.com/kf/201412/363654.html

https://blog.csdn.net/dcrmg/article/details/51987413

https://www.cnblogs.com/zknublx/p/6106343.html

https://www.cnblogs.com/lovemyspring/p/3214598.html


猜你喜欢

转载自blog.csdn.net/fu6543210/article/details/80083292