标题写了那么久,现在现在才有时间,整理下自己的思路。首先先总结下自己对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. Spark2.x学习笔记:Spark SQL程序设计

    1.RDD的局限性 RDD仅表示数据集,RDD没有元数据,也就是说没有字段语义定义. RDD需要用户自己优化程序,对程序员要求较高. 从不同数据源读取数据相对困难. 合并多个数据源中的数据也较困难. ...

  2. [py]access日志入mysql-通过flask前端展示

    目录 pymysql组装sql入库日志 代码组织 将入库的日志通过flask前端展示 pymysql组装sql入库日志 pymysql模块的用法 采集这些指标(metirc)都是linux环境,会用到 ...

  3. ID和Name

    ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...

  4. MongoDB 工具助手类(.NET)

    在开发过程中,需要用到MongoDB,本身MongoDB自己对类的封装就特别好了.为了更加符合我们平时的开发使用,我现在进行了一个简单的封装操作. 连接数据库类:MongoDBContext usin ...

  5. winform dataGridView DataGridViewComboBoxColumn 下拉框事件代码

    有一个dataGridView ,有一列是DataGridViewComboBoxColumn .我用动态绑定,在绑定数据的时候.我们也给这一列绑定数据 在dataGridView的RowsAdded ...

  6. c++四种强制类型转化

    c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast C++ 类型转换(C风格的强制转换): (1)将浮点型数据赋值给整型变 ...

  7. Verilog篇(三)仿真原理

    首先引入一个例子: `timescale  1ns/100ps module   TB;                                                         ...

  8. Python: 合并多个字典

    现在有多个字典或者映射,想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在. eg1: a = {'x': 1, 'z': 3 }b = {'y': 2, 'z': ...

  9. layer常用方法代码

    layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验. 在与同类组件的比较中,layer总是能轻易获胜.她尽可能 ...

  10. ajax请求为异步操作时,返回的数据不会被并列函数执行

    ajax请求为异步操作时,返回的数据不会被并列函数执行