Python Argparse Cant Split字符串

时间:2014-09-06 07:42:05

标签: python split argparse

这应该很简单。但它现在真的得到了我。我已经设置了一个简单的argparse,并希望能够分割一个字符串,如果它有一个减号。听起来很简单,但是当项目被解析为argparse时,它会显示为空白。所以我会告诉你我想做什么以及为什么它让我感到困惑。注意:我很难将其指定为字符串。 dir和type函数显示为空白。

        import argparse
        import sys
        portlist = []

        #Parser Arguments and Usage
        parser = argparse.ArgumentParser(description='This script performs a Syn scan on a specific host with the ports that are specified by you.', usage='Specify Ports with the -p switch. Port range -p 80-200, specific port -p 80, multiple ports -p 80,443,25,22', add_help=True) 
        parser.add_argument('-p', action='store', dest='argPorts', help='Type ports in like follows.  For a range -p 80-200, for a group of ports -p 443,80,25,22 or single port -p 80', required=True, type=str) 
        parser.add_argument('-d', action='store', dest='destIP', help='Type dest IP in this field.  i.e. 192.168.0.5', required=True)
        parser.add_argument('-t', action='store', dest='threadCount', help='Type the amount of threads to use as an integer', type=int, required=True)

        if len(sys.argv)<3:
            parser.print_help()
                sys.exit(0)
        opts = vars(parser.parse_args())

        options = parser.parse_args()
        argPorts = options.argPorts
        destIP = options.destIP
        threadCount = options.threadCount

        if argPorts.find(','):
            print "comma"
            for p in argPorts.split(','):
                portlist.append(p)

        elif argPorts.find('-'):
            print "range"
            portlist.append(argPorts.split('-')[0])
            portlist.append(argPorts.split('-')[1])

        else:
            print "no"


        print portlist

我正在使用命令行,如下所示。 python test.py -t 10 -p&#34; 80-100&#34; -d&#34; 192.168.136.131&#34;

我希望能够将80和100拆分为单独的变量。但它不起作用:(

下面的答案很棒。

对于像我这样的其他人http://www.pythoncentral.io/how-to-see-if-a-string-contains-another-string-in-python/

,这是一个很好的解释

2 个答案:

答案 0 :(得分:1)

问题是,如果找不到搜索字符串,则.find()返回-1。因此,您无法仅通过存在来检查这一点。

你可以尝试这样的事情:

if argPorts.find(',') != -1:
    ...
elif argPorts.find('-') != -1:
    ...

我更喜欢这样的事情:

if ',' in argPorts:
    print("comma")
    for p in argPorts.split(','):
        portlist.append(p)
elif '-' in argPorts:
    print("range")
    portlist.append(argPorts.split('-')[0])
    portlist.append(argPorts.split('-')[1])
else:
    print("no")

附加。我想,如果给出范围,你想要创建一个端口列表。

for port in range(int(argPorts.split('-')[0]), int(argPorts.split('-')[1])+1):
    portlist.append(port)

答案 1 :(得分:1)

您可以将端口解析逻辑移动到一个函数中,并将其作为type传递给您的add_argument('-p'),并添加一些用户友好的异常,如此

def parse_port(port):
    if port.isdigit():
        return int(port)
    else:
        raise argparse.ArgumentTypeError(
                "'{}' is not a valid port".format(port))

def parse_port_range(port_range):
    range_members = port_range.split("-")
    if len(range_members) != 2:
        raise argparse.ArgumentTypeError(
                "'{}' is not a valid port range".format(port_range))
    actual_range = range(parse_port(range_members[0]),
                         parse_port(range_members[1]) + 1)
    return actual_range

def parse_ports(port_string):
    #first break commas
    port_groups = port_string
    if ',' in port_string:
        port_groups = port_string.split(",")            

    #then figure out ranges and populate the set of ports
    ports = set()
    for port_group in port_groups:
        if "-" in port_group:
            port_range = parse_port_range(port_group)
            ports.update(port_range)
        else: # single port
            ports.add(parse_port(port_group))
    return list(ports)

#finally create your CLI argument
parser.add_argument('-p', dest='argPorts', type=parse_ports,
                    help=('Type ports in like follows.  For a range -p 80-200, '
                          'for a group of ports -p 443,80-200,25,22 or single '
                          'port -p 80'))

parser.parse_args()之后,您的options.argPorts包含整数端口列表,如果端口输入错误,则用户会收到有用的消息。