python argparse subparser为变量赋值

时间:2018-01-15 13:34:30

标签: python python-2.7 runtime-error argparse

我想将subparser值分配给变量,例如' rport'所以当用户调用带有

之类的值的参数时
python example.py -sock connectmode -rport 10000 

rport变量取10000 int值,但该代码在&r;中的最后一行返回错误='

AttributeError: 'Namespace' object has no attribute 'rport'

注意:subsparsers用于函数被称为' socketfunc' 我希望他们成为' -sock'的子标志。争论 当我执行:' python example.py -sock connectmode -h 返回secondary_parser args [!]另一个注意事项: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

3 个答案:

答案 0 :(得分:0)

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

希望这可以解决您的问题以获取命令行参数。

答案 1 :(得分:0)

很难弄清楚你想要什么。描述结构不合理并且漫无目的。但我会尝试解释你的代码在做什么。

简化了一下:

Loop

使用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) 在这里不起作用,因为该参数是为这个subparser定义的注释。

args.remoteport是一个简单的True / False参数,与subparsers无关。

答案 2 :(得分:0)

你好家伙的解决方案是替换 rport = args.rport rport=args.remoteport短arg不会获得值,但应指定长arg名称

感谢所有人。