您的位置:首页 > 编程语言 > Python开发

Python中 命令行参数传递 与 处理

2011-08-31 20:13 381 查看
英文原文: http://www.artima.com/weblogs/viewpost.jsp?thread=4829

   很多人会在  if __name__ == "__main__":  中写N多行的代码。 一般情况这是没问题的。 但如果你需要以命令行的方式运行调试, 那么就不方便了。

 

   而这个文章中像C一样定义了一个main()函数, 在  if __name__ == "__main__": 中只有一行 main() 调用, 很好的代码结构!

  而且还有一个好处:你可以通过修改main()的调用参数,达到随意修改命令行参数的目的。

 

First, we change main() to take an optional 'argv' argument, which allows us to call it from the interactive Python prompt:

def main(argv=None):
if argv is None:
argv = sys.argv
# etc., replacing sys.argv with argv in the getopt() call.

首先, 让main()接受默认参数, 然后在main()里头判断, 如果没有给main参数的话,就是用sys.argv作为参数。

 


Note that we fill in the default for argv dynamically. This is more flexible than writing

def main(argv=sys.argv):
# etc.

because sys.argv might have been changed by the time the call is made; the default argument is calculated at the time the main() function is
defined, for all times.

  而这种方法更灵活! 因为在main()内部引用 sys.argv参数时, sys.argv参数可能在调用main()前被我们自己的代码修改过了。 而main(argv=sys.argv)的定义方式, 保证了传给main()的默认参数一定是执行该脚本文件时给的参数!!! 因为Python函数的默认参数是在'编译'阶段就确定了,在运行过程中是不会被修改的。

 

 

 ====== 下面与译文无关, 只是一个练习: =====

下面是从 http://blog.sina.com.cn/s/blog_71c19c620100r7mk.html   上摘抄的:

使用getopt模块处理Unix模式的命令行选项:

getopt模块用于抽出命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式和长选项模式。
    # scriptname.py

    import getopt

    shortargs = 'f:t'

    longargs = ['directory-prefix=', 'format', '--f_long=']

    opts, args = getopt.getopt( sys.argv[1:], shortargs, longargs )

getopt函数的格式是getopt.getopt ( [命令行参数列表], "短选项", [长选项列表] )

短选项名后的冒号(:)表示该选项必须有附加的参数。                    

长选项名后的等号(=)表示该选项必须有附加的参数。

返回opts和args。

opts是一个参数选项及其valu
4000
e的元组( ( '-f', 'hello'), ( '-t', '' ), ( '--format', '' ), ( '--directory-prefix', '/home' ) )

args是一个除去有用参数外其他的命令行输入 ( 'a', 'b' )

然后遍历opts便可以获取所有的命令行选项及其对应参数了。
    for opt, val in opts:

        if opt in ( '-f', '--f_long' ):

            pass

 

对上边的片段, 我整理了一个例子:bell@bell-desktop:/tmp$ cat py_optParse.py

import sys

import getopt

shortargs = 'f:t'

longargs = ['directory-prefix=', 'format', '--f_long=']                        

 # 这时要求长选项参数名字为: ----f_long

 #如果执行python py_optParse.py --f_long  a.txt   那么出错: option --f_long not recognized

 

opts, args = getopt.getopt( sys.argv[1:], shortargs, longargs )

print "opts:", opts

print "args:", args

class Usage(Exception):

   def __init__(self, msg):

     self.msg = msg

 

parameter_missing = True

for opt, val in opts:

    #if opt in ( '-f', '--f_long' ):

    if opt in ( '-f', '----f_long' ):

        parameter_missing = False

if(parameter_missing):

   raise Usage("missing argument!")

bell@bell-desktop:/tmp$ python py_optParse.py -f a.txt

opts: [('-f', 'a.txt')]

args: []
bell@bell-desktop:/tmp$ python py_optParse.py --f_long a.txt

Traceback (most recent call last):

  File "py_optParse.py", line 6, in <module>

    opts, args = getopt.getopt( sys.argv[1:], shortargs, longargs )

  File "/usr/lib/python2.6/getopt.py", line 89, in getopt

    opts, args = do_longs(opts, args[0][2:], longopts, args[1:])

  File "/usr/lib/python2.6/getopt.py", line 153, in do_longs

    has_arg, opt = long_has_args(opt, longopts)

  File "/usr/lib/python2.6/getopt.py", line 170, in long_has_args

    raise GetoptError('option --%s not recognized' % opt, opt)

getopt.GetoptError: option --f_long not recognized
bell@bell-desktop:/tmp$ python py_optParse.py ----f_long a.txt

opts: [('----f_long', 'a.txt')]

args: []

Traceback (most recent call last):

  File "py_optParse.py", line 24, in <module>

    raise Usage("missing argument!")

__main__.Usage
bell@bell-desktop:/tmp$

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息