【问题标题】:argparse and TypeError: execv() arg 2 must contain only stringsargparse 和 TypeError: execv() arg 2 必须只包含字符串
【发布时间】:2016-08-04 12:21:25
【问题描述】:

我知道这个问题已经被问过很多次了,但还是要浏览给出的答案:

  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()

如果您想了解更多信息,请大声告诉我,我会尽我所能。

干杯, 阿杰

【问题讨论】:

  • 错误似乎很明显。 “...必须只包含字符串” 查看您传递给subprocess.call 的列表;它完全由字符串组成吗?
  • 旁注:你有metavar的意思错了。这应该是一个“变量”名称,而不是重复的默认值。例如“-f”选项的“文件名”或“路径”。我还建议为选项提供更长的描述性名称,而不仅仅是那些字符名称。 nargs 参数没有任何作用,因为 1 是默认值。 ArgumentParser 的参数是多余的。该信息通常由来自sys.argv 的对象本身和添加的参数确定。

标签: python python-2.7 typeerror argparse


【解决方案1】:

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

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

打印这一行:

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

我从错误中猜测 args.p['21'] 而它应该只是 '21'

元变量、名称等的选择只是风格问题,不影响运行。

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

【讨论】:

  • 很遗憾,由于声誉低(新帐户),我无法标记此内容。非常感谢 hpaulj,辛苦了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多