• python 处理命令行参数--转载


    标题写了那么久,现在现在才有时间,整理下自己的思路。首先先总结下自己对sys模块的理解。手册上对sys的描述是系统参数和系统函数,这里的系统实际上是python解释器。这个模块提供了用户可以访问的解释器变量和一些可以与解释器进行交互的功能函数。这里主要关注的就是sys.argv,其实它就是一个解释器变量,通过sys模块,我们就可以访问,并且根据自己的需要来解析。

    sys.argv

    描述:记录命令行参数
    类别:列表(可以使用列表方法来访问)
    我用的系统是RHL 5.3,python 版本为2.4,写了个测试程序PyTest.py来观察python解释器调用时,sys.agrv的元素的值:

    点击(此处)折叠或打开

    1. #!/usr/bin/env python
    2. import sys
    3. def main(argv):
    4.      for arg in argv:
    5.         print arg
    6. if __name__ == '__main__':
    7.     main(sys.argv)
    那我们开始调用测试脚本:
    1. python PyTest.py 输出结果:PyTest.py, 原始列表为['PyTest.py']
    2. python PyTest.py -c 0 a:1:b 输出结果为:PyTest.py -c 0 a:1:b。说明解释器是以空格或者制表符来区分参数。
    3. python /root/python_scripts/PyTest.py 输出结果为: /root/python_scripts/PyTest.py。记录的是绝对路径。
    4. chmod +x PyTest.py;./PyTest.py 输出结果为: ./PyTest.py
    5. /root/python_scripts/PyTest.py 输出结果为: /root/python_scripts/PyTest.py
    注:说明sys.argv[0]保存的是可执行程序名,后面是命令行参数,以空格为区分点。
    下面介绍下C语言风格的命令行解析模块getopt。这个支持短命令(-a)和长命令模式(--add)。getopt的调用方式为:getopt.getopt(args, 'hvo:')或者getopt.getopt(args,'hvo:', ['help', 'version', 'output=']),如果只使用长命令,短命令参数必须是个空字符串。:表示参数后必须有参数,=表示长命令后必须有参数。
    示例代码:

    点击(此处)折叠或打开

    1. #!/usr/bin/env python 
    2. import sys
    3. import getopt
    4. def Usage():
    5.     print 'PyTest.py usage:'
    6.     print '-h,--help: print help message.'
    7.     print '-v, --version: print script version'
    8.     print '-o, --output: input an output verb'
    9.     print '--foo: Test option '
    10.     print '--fre: another test option'
    11. def Version():
    12.     print 'PyTest.py 1.0.0.0.1'
    13. def OutPut(args):
    14.     print 'Hello, %s'%args
    15. def main(argv):
    16.     try:
    17.         opts, args = getopt.getopt(argv[1:], 'hvo:', ['output=', 'foo=', 'fre='])
    18.     except getopt.GetoptError, err:
    19.         print str(err)
    20.         Usage()
    21.         sys.exit(2)
    22.     for o, a in opts:
    23.         if o in ('-h', '--help'):
    24.             Usage()
    25.             sys.exit(1)
    26.         elif o in ('-v', '--version'):
    27.             Version()
    28.             sys.exit(0)
    29.         elif o in ('-o', '--output'):
    30.             OutPut(a)
    31.             sys.exit(0)
    32.         elif o in ('--foo',):
    33.             Foo=a
    34.         elif o in ('--fre',):
    35.             Fre=a
    36.         else:
    37.             print 'unhandled option'
    38.             sys.exit(3)
    39. if __name__ == '__main__':
    40.     main(sys.argv)
    19行: 调用函数时返回两个列表, 第一个列表保存参数和值的元组集合,第二个列表保存其他值,不在参数指定的所有值。
    [root@node5 python_scripts]# ./PyTest.py --f
    option --f not a unique prefix
    PyTest.py usage:
    -h,--help: print help message.
    -v, --version: print script version
    -o, --output: input an output verb
    --foo: Test option 
    --fre: another test option
    [root@node5 python_scripts]# ./PyTest.py --fo
    option --foo requires argument
    PyTest.py usage:
    -h,--help: print help message.
    -v, --version: print script version
    -o, --output: input an output verb
    --foo: Test option 
    --fre: another test option
    这两个调用过程可以看到getopt可以进行唯一匹配。
    [root@node5 python_scripts]# ./PyTest.py -h -v
    PyTest.py usage:
    -h,--help: print help message.
    -v, --version: print script version
    -o, --output: input an output verb
    --foo: Test option 
    --fre: another test option
    [root@node5 python_scripts]# ./PyTest.py -v -h
    PyTest.py 1.0.0.0.1
    这里可以看到解析顺序从前向后。
    [root@node5 python_scripts]# ./PyTest.py -o a --output ab
    Hello, a
    [root@node5 python_scripts]# ./PyTest.py --output ab -o a
    Hello, ab
    这里可以看到实际上-o和--output是分开处理的。
    从这里我们可以总结下getopt的特点:
    1 getopt是从前到后解析
    2 getopt不检查额外参数的合法性,需要自行检查
    3 短命令行和长命令行是分开解析的。
    稍后完善
    模块optparse提供了OptionParser用来解析命令行,optparse在2.3引进,2.7弃用,2.7以后用argparse替代。
    OptionParser将自动生成帮助信息。
    OptionParser的使用过程

    点击(此处)折叠或打开

    1. from optparse import OptionParser
    导入OptionParser。

    点击(此处)折叠或打开

    1. parser = OptionParser()
    生成OptionParser的一个实例

    点击(此处)折叠或打开

    1. parser.add_option('c', 'clear', dest='clear_option', default=False, action='store_true', help = 'Clean origin configurations and databases.')
    添加命令行选项

    点击(此处)折叠或打开

    1. (options, args) = parser.parse_args(sys.argv[1:])
    解析命令行
    options.clear_option 使用命令行。
    python 创建目录
    os.mkdir()  创建一个非递归目录
    os.makedirs() 创建一个递归目录
     
     
     
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import sys, getopt
    
    def main(argv):
       inputfile = ''
       outputfile = ''
       try:
          opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
       except getopt.GetoptError:
          print 'test.py -i <inputfile> -o <outputfile>'
          sys.exit(2)
       for opt, arg in opts:
          if opt == '-h':
             print 'test.py -i <inputfile> -o <outputfile>'
             sys.exit()
          elif opt in ("-i", "--ifile"):
             inputfile = arg
          elif opt in ("-o", "--ofile"):
             outputfile = arg
       print '输入的文件为:', inputfile
       print '输出的文件为:', outputfile
    
    if __name__ == "__main__":
       main(sys.argv[1:])

    执行以上代码,输出结果为:

    $ python test.py -h
    usage: test.py -i <inputfile> -o <outputfile>
    
    $ python test.py -i inputfile -o outputfile
    输入的文件为: inputfile
    输出的文件为: outputfile
     
  • 相关阅读:
    bzoj1027 状压dp
    CodeForces755F 贪心 + 多重背包二进制优化
    CodeForces632E 神奇的多重背包
    POJ3662 SPFA//二分 + 双端队列最短路
    bzoj1233 单调队列优化dp
    POJ3417 LCA+树dp
    Network
    树网的核/[SDOI2011]消防
    [APIO2010]巡逻
    核心城市
  • 原文地址:https://www.cnblogs.com/nkwy2012/p/6373762.html
Copyright © 2020-2023  润新知