【发布时间】:2016-08-04 12:21:25
【问题描述】:
我知道这个问题已经被问过很多次了,但还是要浏览给出的答案:
- 还没有解决我的问题
- 与我所看到的内容无关
总的来说,我对编码比较陌生,这是我第一次尝试使用 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()
如果您想了解更多信息,请大声告诉我,我会尽我所能。
干杯, 阿杰
【问题讨论】:
-
错误似乎很明显。 “...必须只包含字符串” 查看您传递给
subprocess.call的列表;它完全由字符串组成吗? -
旁注:你有
metavar的意思错了。这应该是一个“变量”名称,而不是重复的默认值。例如“-f”选项的“文件名”或“路径”。我还建议为选项提供更长的描述性名称,而不仅仅是那些字符名称。nargs参数没有任何作用,因为 1 是默认值。ArgumentParser的参数是多余的。该信息通常由来自sys.argv的对象本身和添加的参数确定。
标签: python python-2.7 typeerror argparse