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

【问题】

在:

的折腾过程中,想要实现,将使用argparse解析后的命令行的参数,像使用optparse解析后的参数一样,去导出这些变量,使得后面的代码,可以直接用于参数值。

相关的,使用optparse解析并导出变量的代码为:# 2. 演示optparse的用法

oldParser = 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));

使用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去使用对应的参数了。

但是想要实现,后续代码可以直接此处的username_argparse和age_argparse。

即,需要像上面的optparse中一样,通过exec去export对应的变量一样。

【解决过程】

1.此处,先去研究args的变量,最终搞懂了,是对应的namespace类型: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();

print "args=",args; #args= Namespace(age_argparse=1000, username_argparse='crifanLi')

print "type(args)=",type(args); #type(args)=

然后想要想办法,找到其中的age_argparse和username_argparse,然后后续的折腾,就是:

然后,得到了字典类型的argsDict变量后,接着就是想办法,把变量的key和value,像optparse一样,去用exec去导出了。

2.结果是,先通过: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();

print "args=",args; #args= Namespace(age_argparse=1000, username_argparse='crifanLi')

print "type(args)=",type(args); #type(args)=

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

的错误:Traceback (most recent call last):

File "D:\tmp\tmp_dev_root\python\parse_cmd_para\parse_command_line_para.py", line 108, in

cmdParaDemo();

File "D:\tmp\tmp_dev_root\python\parse_cmd_para\parse_command_line_para.py", line 61, in cmdParaDemo

exec(eachArg + " = " + argsDict[eachArg]);

TypeError: cannot concatenate 'str' and 'int' objects

2.再通过: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();

print "args=",args; #args= Namespace(age_argparse=1000, username_argparse='crifanLi')

print "type(args)=",type(args); #type(args)=

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]) != ""):

exec(eachArg + " = " + str(argsDict[eachArg]));

else:

exec(eachArg + " = " + argsDict[eachArg]);

出现了:

NameError: name ‘crifanLi’ is not defined

的错误:Traceback (most recent call last):

File "D:\tmp\tmp_dev_root\python\parse_cmd_para\parse_command_line_para.py", line 108, in

cmdParaDemo();

File "D:\tmp\tmp_dev_root\python\parse_cmd_para\parse_command_line_para.py", line 65, in cmdParaDemo

exec(eachArg + " = " + str(argsDict[eachArg]));

File "", line 1, in

NameError: name 'crifanLi' is not defined

3.最后经过一堆的折腾,终于搞定了。

这样写就可以了:# 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();

print "args=",args; #args= Namespace(age_argparse=1000, username_argparse='crifanLi')

print "type(args)=",type(args); #type(args)=

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]) != ""):

# exec(eachArg + " = " + str(argsDict[eachArg])); #NameError: name 'crifanLi' is not defined

# else:

# exec(eachArg + " = " + argsDict[eachArg]);

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));

正常输出为:parsed argsDict= {'age_argparse': 1000, 'username_argparse': 'crifanLi'}

argparse: Your input username_argparse=crifanLi, type(username_argparse)=, age_argparse=1000, type(age_argparse)=

【总结】

看来,之前optparse中通过for i in dir(options):

exec(i + " = options." + i);

而可以正常导出变量的原因在于,其中的options,就是和argparse中的args一样,都是一个namespace,所以,最终通过

namespace.someKey

的方式,可以通过exec最终得到赋值,由此实现变量导出的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值