欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

命令行解析

程序员文章站 2022-03-24 23:45:52
...

命令行解析的方法有4种(我遇到的)

  • sys.argv

  • tensorflow.app

  • optparse

  • argparse

1 sys.argv

参考 : https://www.cnblogs.com/liangmingshen/p/8906148.html

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

参考 :  https://www.cnblogs.com/paulwhw/p/9065074.html

 一、关于解析命令行参数的方法

  关于“解析命令行参数”的方法我们一般都会用到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可以查看帮助信息
在这里插入图片描述

更多参数介绍可以参看这个链接