python argparse 子解析器为变量赋值
python argparse subparser assign value to variable
我想将子解析器值分配给像 'rport' 这样的变量,所以当用户调用具有像
这样的值的参数时
python example.py -sock connectmode -rport 10000
rport 变量采用 10000 int 值,但 'rport = '
中最后一行的代码 return 错误
AttributeError: 'Namespace' object has no attribute 'rport'
注意:子解析器用于调用函数 'socketfunc'
我希望它们成为“-sock”参数的子参数
当我执行时:'python example.py -sock connectmode -h
return 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
import sys
def getcmdlineargv(argv):
"""Function to get values from cmd line and converted into dictionary"""
opts = {} # dictionary to store key-value pairs.
while argv: # until arguments left to parse...
if argv[0][0] == '-': # Found a "-name value" pair.
opts[argv[0]] = argv[1] # Add key and value to the dictionary.
argv = argv[1:] # Reduce the argument list by copying it starting from index 1.
return opts
argvDict = getcmdlineargv(sys.argv)
print(argvDict)
>>> python filename.py -sock connectmode -rport 10000
>>> {'-sock': 'connectmode', '-rport': '10000'}
使用参数解析器:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-sock", type=str, help='')
parser.add_argument("-rport", type=int, help='')
parsarg = vars(parser.parse_args())
print(parsarg.get('rport'))
>>> python filename.py -sock connectmode -rport 10000
>>> 10000
希望这能解决您获取命令行参数的问题。
很难弄清楚你想要什么。描述格式不正确且杂乱无章。但我会尽力解释您的代码在做什么。
简化了一点:
import argparse
parser = argparse.ArgumentParser()
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',action="store_true")
secondary_parser.add_argument('-rport','--remoteport',required=True)
secondary_parser.add_argument("-rhost",'--destination',required=True)
secondary_parser.set_defaults(func='secondary')
listenmode_parser.set_defaults(func='listen')
args = parser.parse_args()
print(args)
具有 connectmode
个值:
1027:~/mypy$ python3 stack48264081.py -sock connectmode -rport 10000
usage: stack48264081.py connectmode [-h] -rport REMOTEPORT -rhost DESTINATION
stack48264081.py connectmode: error: the following arguments are required: -rhost/--destination
为什么?因为您将 -rhost
定义为 connectmode
子解析器的必需参数。如果我同时提供:
1031:~/mypy$ python3 stack48264081.py -sock connectmode -rport 10000 -rhost foo
Namespace(destination='foo', func='secondary', remoteport='10000', socket=True)
在这种情况下 args.remoteport
可以。 args.rport
不会,因为 dest
取自长名称 --
,而不是短名称。
1034:~/mypy$ python3 stack48264081.py listenmode
Namespace(func='listen', socket=False)
args.remoteport
在这里不起作用,因为没有为该子解析器定义该参数。
-sock
是一个简单的 True/False 参数,与子解析器无关。
大家好,解决方案是更换
rport = args.rport
与 rport=args.remoteport
短参数不包含值但应指定长参数名称
谢谢大家。
我想将子解析器值分配给像 'rport' 这样的变量,所以当用户调用具有像
这样的值的参数时python example.py -sock connectmode -rport 10000
rport 变量采用 10000 int 值,但 'rport = '
中最后一行的代码 return 错误AttributeError: 'Namespace' object has no attribute 'rport'
注意:子解析器用于调用函数 'socketfunc' 我希望它们成为“-sock”参数的子参数 当我执行时:'python example.py -sock connectmode -h return 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
import sys
def getcmdlineargv(argv):
"""Function to get values from cmd line and converted into dictionary"""
opts = {} # dictionary to store key-value pairs.
while argv: # until arguments left to parse...
if argv[0][0] == '-': # Found a "-name value" pair.
opts[argv[0]] = argv[1] # Add key and value to the dictionary.
argv = argv[1:] # Reduce the argument list by copying it starting from index 1.
return opts
argvDict = getcmdlineargv(sys.argv)
print(argvDict)
>>> python filename.py -sock connectmode -rport 10000
>>> {'-sock': 'connectmode', '-rport': '10000'}
使用参数解析器:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-sock", type=str, help='')
parser.add_argument("-rport", type=int, help='')
parsarg = vars(parser.parse_args())
print(parsarg.get('rport'))
>>> python filename.py -sock connectmode -rport 10000
>>> 10000
希望这能解决您获取命令行参数的问题。
很难弄清楚你想要什么。描述格式不正确且杂乱无章。但我会尽力解释您的代码在做什么。
简化了一点:
import argparse
parser = argparse.ArgumentParser()
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',action="store_true")
secondary_parser.add_argument('-rport','--remoteport',required=True)
secondary_parser.add_argument("-rhost",'--destination',required=True)
secondary_parser.set_defaults(func='secondary')
listenmode_parser.set_defaults(func='listen')
args = parser.parse_args()
print(args)
具有 connectmode
个值:
1027:~/mypy$ python3 stack48264081.py -sock connectmode -rport 10000
usage: stack48264081.py connectmode [-h] -rport REMOTEPORT -rhost DESTINATION
stack48264081.py connectmode: error: the following arguments are required: -rhost/--destination
为什么?因为您将 -rhost
定义为 connectmode
子解析器的必需参数。如果我同时提供:
1031:~/mypy$ python3 stack48264081.py -sock connectmode -rport 10000 -rhost foo
Namespace(destination='foo', func='secondary', remoteport='10000', socket=True)
在这种情况下 args.remoteport
可以。 args.rport
不会,因为 dest
取自长名称 --
,而不是短名称。
1034:~/mypy$ python3 stack48264081.py listenmode
Namespace(func='listen', socket=False)
args.remoteport
在这里不起作用,因为没有为该子解析器定义该参数。
-sock
是一个简单的 True/False 参数,与子解析器无关。
大家好,解决方案是更换
rport = args.rport
与 rport=args.remoteport
短参数不包含值但应指定长参数名称
谢谢大家。