最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【整理】Python中如何获得并处理命令行参数

Python crifan 7063浏览 0评论

运行Python脚本时,时常需要从命令行中传递一些参数到Python程序中,但是如何获得相应的传递进来的参数,以及如何解析这些参数,是很多人,包括最开始的我,所遇到的问题。

下面,就对此总结一下:

先介绍基本背景知识:

1. Python中,可以通过sys.argv获得,命令行中所输入的全部的内容,获得的值是个列表变量。

列表中的值,分别是命令行中,通过空格分隔出来的各个值。

2.可以通过(旧的)optparse或(新的)argparse,来实现解析命令行中所输入的参数。

 

下面就是详细的代码示例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
【功能】
 演示Python中命令行参数的获取和解析:
【整理】Python中如何获得并处理命令行参数
https://www.crifan.com/python_capture_and_parse_command_line_parameter

【作者】 Crifan Li
【版本】 2012-11-15

"""

#sys模块中包含了相关的,获得命令参数的功能
import sys;

#optparse是一个用于解析命令行输出参数的模块
import optparse;
#不过,该模块自动Python 2.7往后就废弃了,而推荐使用argparse:
#Deprecated since version 2.7: The optparse module is deprecated and will not be developed further; development will continue with the argparse module.


import argparse;

def cmdParaDemo():
    # 1. 演示sys.argv所获得的命令行中的输入的所有的内容
    print "The whole string you input can get from sys.argv=",sys.argv;
    argvLen = len(sys.argv);
    print "total fileds in sys.argv=",argvLen;
    
    for i,eachArg in enumerate(sys.argv):
        print "[%d]=%s"%(i, eachArg);
    
    # 2. 演示optparse的用法
    oldParser = optparse.OptionParser();
    oldParser.add_option("-u","--username",action="store", type="string",dest="username_optparse",help="Your user name");
    oldParser.add_option("-a","--age",action="store", type="int",dest="age_optparse",help="Your age");
    
    (options, args) = oldParser.parse_args();
    #此处用于导出所获得的变量
    #如果没有导出变量,则后面代码中,如果用到此处定义的参数所对应的变量时,就会报错,说找不到相关的变量
    #NameError: global name 'username_optparse' is not defined
    for i in dir(options):
        exec(i + " = options." + i);
    
    print "optparse: Your input username_optparse=%s, type(username_optparse)=%s, age_optparse=%d, type(age_optparse)=%s"%(username_optparse, type(username_optparse), age_optparse, type(age_optparse));
    
    # 3. 演示argparse的用法
    newParser = argparse.ArgumentParser();
    newParser.add_argument("-u", "--username", dest="username_argparse", help="Your user name");
    newParser.add_argument("-a", "--age", type=int, dest="age_argparse", help="Your age");
    args = newParser.parse_args();

    #后面,如果想要使用变量,则可以:
    #args.username_argparse
    #args.age_argparse
    #的方式引用
    
    print "args=",args; #args= Namespace(age_argparse=1000, username_argparse='crifanLi')
    print "type(args)=",type(args); #type(args)= <class 'argparse.Namespace'>
    
    argsDict = args.__dict__;
    print "parsed argsDict=",argsDict; #parsed argsDict= {'age_argparse': 1000, 'username_argparse': 'crifanLi'}
    
    # for eachArg in argsDict.keys():
        # exec(eachArg + " = " + argsDict[eachArg]); # -> TypeError: cannot concatenate 'str' and 'int' objects
    
    # for eachArg in argsDict.keys():
        # if(type(argsDict[eachArg]) != "<type 'string'>"):
            # exec(eachArg + " = " + str(argsDict[eachArg])); # -> NameError: name 'crifanLi' is not defined
        # else:
            # exec(eachArg + " = " + argsDict[eachArg]);

    #此处用于导出所获得的变量
    #(1)如果没有导出变量,则后面代码中:
    #如果用到此处定义的参数所对应的变量时,就会报错,说找不到相关的变量
    #NameError: global name 'username_optparse' is not defined
    #(2)而导出之后,后面就可以直接通过参数名:
    #username_argparse
    #age_argparse
    #的方式引用参数了。
    for eachArg in argsDict.keys():
        exec(eachArg + " = args." + eachArg);
    
    print "argparse: Your input username_argparse=%s, type(username_argparse)=%s, age_argparse=%d, type(age_argparse)=%s"%(username_argparse, type(username_argparse), age_argparse, type(age_argparse));

###############################################################################
if __name__=="__main__":
    cmdParaDemo();

而对应的完整的输出为:

D:\tmp\tmp_dev_root\python\parse_cmd_para>parse_command_line_para.py -u crifanLi -a 1000
The whole string you input can get from sys.argv= ['D:\\tmp\\tmp_dev_root\\python\\parse_cmd_para\\parse_command_line_para.py', '-u', 'crifanLi', '-a', '1000']
total fileds in sys.argv= 5
[0]=D:\tmp\tmp_dev_root\python\parse_cmd_para\parse_command_line_para.py
[1]=-u
[2]=crifanLi
[3]=-a
[4]=1000
optparse: Your input username_optparse=crifanLi, type(username_optparse)=<type 'str'>, age_optparse=1000, type(age_optparse)=<type 'int'>
args= Namespace(age_argparse=1000, username_argparse='crifanLi')
type(args)= <class 'argparse.Namespace'>
parsed argsDict= {'age_argparse': 1000, 'username_argparse': 'crifanLi'}
argparse: Your input username_argparse=crifanLi, type(username_argparse)=<type 'str'>, age_argparse=1000, type(age_argparse)=<type 'int'>

D:\tmp\tmp_dev_root\python\parse_cmd_para>parse_command_line_para.py --username crifanLi --age 1000
The whole string you input can get from sys.argv= ['D:\\tmp\\tmp_dev_root\\python\\parse_cmd_para\\parse_command_line_para.py', '--username', 'crifanLi', '--age', '1000']
total fileds in sys.argv= 5
[0]=D:\tmp\tmp_dev_root\python\parse_cmd_para\parse_command_line_para.py
[1]=--username
[2]=crifanLi
[3]=--age
[4]=1000
optparse: Your input username_optparse=crifanLi, type(username_optparse)=<type 'str'>, age_optparse=1000, type(age_optparse)=<type 'int'>
args= Namespace(age_argparse=1000, username_argparse='crifanLi')
type(args)= <class 'argparse.Namespace'>
parsed argsDict= {'age_argparse': 1000, 'username_argparse': 'crifanLi'}
argparse: Your input username_argparse=crifanLi, type(username_argparse)=<type 'str'>, age_argparse=1000, type(age_argparse)=<type 'int'>

 

提示:

期间遇到一个问题,折腾半天,终于解决了:

【已解决】Python中,如何导出argparse解析后的namespace中的变量(export argparse parsed argument)

 

【总结】

简单说就是通过sys.argv可以获得所输入的所有的内容,包括参数。

然后通过相关参数解析模块(optparse或argparse)去解析,得到对应参数的值。

转载请注明:在路上 » 【整理】Python中如何获得并处理命令行参数

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. 能不能解决输入^的问题,这个符号单个输入读不到,怎么才能让它单独出现的时候能被读到,也就是说单独占一个参数。。。输入也只输入^,求解决(●—●)
    YY9年前 (2016-01-11)回复
  2. 如果只是解释一下什么是命令行参数,实际上用一个最简单的例子就可以了。 sys.arg[0] 文件名 sys.arg[1] 命令行输入的参数1 sys.arg[2] 命令行输入的参数2 上面的例子内容也太多了
    webjust10年前 (2014-12-03)回复
  3. 楼主你好,我在用 optparse 模块时感到很困惑,不是在命令行提供用户名和密码就ok吗,为什么会提示“ %d format: a number is required, not NoneType”呢
    陈小小11年前 (2014-04-03)回复
86 queries in 0.192 seconds, using 22.15MB memory