argparse和TypeError:execv()arg 2必须只包含字符串

时间:2016-04-13 12:05:28

标签: python python-2.7 typeerror argparse

我知道这个问题已经被提了很多,但是在下面给出了答案:

  1. 尚未解决我的问题
  2. 与我所看到的不相关
  3. 我对编码总体上比较新,这是我第一次尝试使用argparse。

    基本上我从我的脚本中收到以下错误:

    TypeError: execv() arg 2 must contain only strings
    

    我正在尝试为Spike Fuzzer编写一个非常简单的包装器,当我将参数-p,-v和-s静态设置为整数(不使用argparse)时,脚本运行没有问题。当我尝试使用它们的参数时,我看到上面的错误。

    请参阅以下代码:

    import argparse, subprocess, os, sys
    
    parser = argparse.ArgumentParser(prog='fuzz.py', 
                                    usage='%(prog)s -i 127.0.0.1 -p 21 -d /root/example -v 0 -s 0', 
                                    )
    
    parser.add_argument('--version', action='version', version='[+] Version: BETA')
    
    parser.add_argument('-i', metavar='127.0.0.1',  
                        help="IP Address"
                        )
    
    parser.add_argument('-p', 
                        type=int,
                        default=21,
                        metavar='21',
                        nargs=1, 
                        help="Port (Default 21)",
                        )
    
    parser.add_argument('-d', metavar='/root/example',  
                        help="Spike script directory"
                        )
    
    parser.add_argument('-f', metavar='example.spk', 
                        nargs=1, 
                        help="Spike File"
                        )
    
    parser.add_argument('-v', 
                        type=int,
                        default=0,
                        metavar='0', 
                        nargs=1, 
                        help="SKIPVAR (Default 0)",
                        )
    
    parser.add_argument('-s', 
                        type=int,
                        default=0,
                        metavar='0', 
                        nargs=1, 
                        help="SKIPSTR (Default 0)",
                        )
    
    args = parser.parse_args()
    
    def Directory():
        for file in os.listdir(args.d):
            if file.endswith(".spk"):
                print file
                fuzzer = subprocess.call(['generic_send_tcp', args.i, args.p, file, args.v, args.s])
    
    Directory()
    

    如果您想了解更多信息,请给我一个大喊大叫,我将尽我所能。

    干杯, AJ

1 个答案:

答案 0 :(得分:0)

关于argparse使用,唯一明显的问题是使用nargs=1。这样,值将是一个元素列表,而不是字符串。将其关闭(或使用默认的nargs=None),值将为字符串。

解析后打印args以清楚地了解已解析的内容。如果需要打印选定的值,例如。 args.v

打印此行:

['generic_send_tcp', args.i, args.p, file, args.v, args.s]

我猜错args.p ['21']的错误应该只是'21'

metavar,名称等的选择只是风格问题,不影响跑步。

In [360]: p=argparse.ArgumentParser()

In [361]: p.add_argument('-f',nargs=1)
Out[361]: _StoreAction(option_strings=['-f'], dest='f', nargs=1, const=None, default=None, type=None, choices=None, help=None, metavar=None)

In [362]: p.parse_args(['-f','12'])
Out[362]: Namespace(f=['12'])