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



我知道这个问题已经被问了很多次了,但我也在搜索给出的答案:

  1. 尚未解决我的问题
  2. 与我所看到的并不相关

一般来说,我对编码相对陌生,这是我第一次尝试使用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

关于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'])

最新更新