【发布时间】:2018-06-24 03:33:41
【问题描述】:
我想将子解析器的值分配给像“rport”这样的变量,所以当用户调用具有像
这样的值的参数时python example.py -sock connectmode -rport 10000
rport 变量采用 10000 int 值,但该代码在 'rport = ' 的最后一行返回错误
AttributeError: 'Namespace' object has no attribute 'rport'
注释:子解析器用于一个名为“socketfunc”的函数 我希望它们成为“-sock”论点的子参数 当我执行时:'python example.py -sock connectmode -h 返回 secondary_parser 参数 [!]另一个注意事项:rport 和 rhost 变量是全局变量,以使它们的值可用于所有函数
任何帮助!谢谢。
代码是:
import argparse
import socket
parser = argparse.ArgumentParser(epilog='\tExample: \r\npython ' + sys.argv[0])
parser.error = parser_error
parser._optionals.title = "OPTIONS"
subparsers = parser.add_subparsers(help='Specify secondary options')
global rport , rhost
secondary_parser = subparsers.add_parser('connectmode', help='sock argument connectmode')
listenmode_parser = subparsers.add_parser('listenmode',help='sock argument listenmode')
parser.add_argument('-sock','--socket',help="tcp socket functions [!] support only ipv4 for now",action="store_true")
secondary_parser.add_argument('-rport','--remoteport',help="destination port to connect to",required=True,action='store')
secondary_parser.add_argument("-rhost",'--destination',help="destination host ip addr",required=True,action='store')
secondary_parser.set_defaults(func=socketfunc)
listenmode_parser.set_defaults(func=socketfunc)
args = parser.parse_args()
rport = args.rport
【问题讨论】:
-
第二行,试试
parser = argparse.ArgumentParser(epilog='\tExample: \r\npython ' + sys.argv[0])而不是parser = argparse.ArgumentParser(epilog='\tExample: \r\npython ' + sys.argv[0] + ") -
嗨,伙计,我现在的问题是如何使 rport 变量采用子解析器 rport 参数的值
-
@mahmoudadel 将 args = parser.parse_args() 替换为 args = vars(parser.parse_args()) 并获取值 rport = args.get('rport')
-
你试过
rport = args.remoteport吗? argparse 使用长参数名称命名其参数
标签: python python-2.7 runtime-error argparse