标题写了那么久,现在现在才有时间,整理下自己的思路。首先先总结下自己对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
 

python 处理命令行参数--转载的更多相关文章

  1. python处理命令行参数

    直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...

  2. awk,perl,python的命令行参数处理

    Python,Perl,Bash命令行参数 Part I 日常经常性的和Perl,Python,Bash打交道,但是又经常性的搞混他们之间,在命令行上的特殊性和index的区别,Python真的是人性 ...

  3. Python 的命令行参数处理 optparse->argparse

    optaprse自2.7版开始弃用:弃用optparse模块,不会进一步开发,将继续开发argparse模块作为替代. 但是用习惯了optparse,还是很好用的撒. optparse使用起来,相比旧 ...

  4. Python 获得命令行参数的方法

    如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢?需要模块:sys参数个数:len(sys.argv)脚本名:    sys.argv[0]参数1 ...

  5. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  6. python中命令行参数

    python中的命令行参数 python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 le ...

  7. Python 中命令行参数解析工具 docopt 安装和应用

    什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...

  8. Python的命令行参数(argparse)

    参考:https://www.cnblogs.com/lindaxin/p/7975697.html 参考:https://www.cnblogs.com/dengtou/p/8413609.html ...

  9. python之命令行参数解析模块argparse

    """argparse模块使得写用户友好性命令行接口很容易,程序定义所需要的参数,argparse会从ays.argv中提取出这些参数.argparse模块也能自动的产生 ...

随机推荐

  1. ssm后台开发及发布

    本文详细讲解一下后台的创建及发布过程,包括踩过的坑 1:首先创建war包形式的maven工程 File>new>Maven project>Create a simple proje ...

  2. 图文解析Spark2.0核心技术(转载)

    导语 Spark2.0于2016-07-27正式发布,伴随着更简单.更快速.更智慧的新特性,spark 已经逐步替代 hadoop 在大数据中的地位,成为大数据处理的主流标准.本文主要以代码和绘图的方 ...

  3. lua的文件管理

    lua没有自己的文件管理 只有读取和写入文件,但是可以通过调用lfs(LuaFileSystem),lfs是一个 用于lua进行文件访问的库,支持lua5.1和lua5.2,并且跨平台 lfs的使用: ...

  4. (转)Elasticsearch索引mapping的写入、查看与修改

    mapping的写入与查看 首先创建一个索引: curl -XPOST "http://127.0.0.1:9200/productindex" {"acknowledg ...

  5. 图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)

    #include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j, ...

  6. HDU1203:I NEED A OFFER!(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1203 Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准 ...

  7. R语言学习笔记:基础知识

    1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) ...

  8. jquery更改表格行顺序实例

    使用jquery写的更改表格行顺序的小功能 表格部分: 复制代码代码如下: <table class="table" id="test_table"> ...

  9. Linux (RHEL)修改时区

    1.修改配置文件修改为上海时区 vi /etc/sysconfig/clock ZONE="Asia/Shanghai" 2.创建上海时区的软连接 ln -sf /usr/shar ...

  10. map() 方法

    1. 方法概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 2. 例子 2.1 在字符串中使用map 在一个 String 上使用 map 方法获取字符串中每 ...