如何将int或字符串传递给命令行参数

时间:2014-01-21 18:30:41

标签: python parsing command-line-arguments

我正在尝试找到一种将int或字符串传递给特定命令行参数的方法,但我知道传递给命令行的eveything会以字符串形式返回,有没有办法解决这个问题?

继承我的代码:

parser = ArgumentParser(
    description="Generate a simple presentation based on MTD file content"
    )
parser.add_argument(
    '-m',
    dest='mdd',
    help="Full path of target mdd",
    required=True,
    metavar="\"<data>.mdd\"",
    )
parser.add_argument(
    '-v',
    dest='version',
    help="The version (latest/active/basic or numerical version)",
    required=False,
    default='latest'
    )

args = parser.parse_args()

MDD_PATH = args.mdd
VERSION = args.version

这是我在命令行中输入的内容@

-m "C:\Users\xxxx\workspace\xxxx\src\Testing\Data\filename.mdd"
-v "22"

我希望-v接受整数和字符串,它有一个默认属性,如果需要可以绕过,但我需要一些帮助,允许它在整数和字符串之间切换。

由于

4 个答案:

答案 0 :(得分:0)

在命令行中,一切都是字符串。你的程序无法区分:

program -v "22"

program -v 22

shell使用引号来转义参数中的空格。


在你的python代码中,你可以尝试将它转换为int:

VERSION = args.version
try:
    VERSION = int(VERSION)
except ValueError:
    pass

答案 1 :(得分:0)

您可以使用add_argument method的关键字参数type。它定义了一种方法,可以使用内置类型或回调将命令行参数转换为您想要的任何内容。 它提供了更好的错误处理,是对命令行进行“类型检查”的首选方法。

答案 2 :(得分:0)

使用type参数,您还可以过滤掉无效字符串:

def parse_version(v):
    if v in ('latest', 'active', 'basic'):
        return v
    else:
        return int(v)   # this will error if v is non-numeric, causing the
                        # parser to reject the argument

parser.add_argument(
    '-v',
    dest='version',
    help="The version (latest/active/basic or numerical version)",
    required=False,
    default='latest',
    type=parse_version
)

答案 3 :(得分:0)

我喜欢使用通常称为tryconvert的通用辅助函数。给定一个值和一个类型列表(或任何可调用的,真的)它会尝试将值转换为每个类型并返回第一个有效的转换。如果所有这些都失败,则返回原始值。

def tryconvert(value, *types):
    for t in types:
        try:
            return t(value)
        except ValueError, TypeError:
            pass
    return value

这可以与您type电话上的add_argument参数一起使用,如下所示:

parser.add_argument(
    '-v',
    dest='version',
    help="The version (latest/active/basic or numerical version)",
    required=False,
    default='latest',
    type=lambda v: tryconvert(v, int)
) 

如果对数字的解析失败(例如None),只需将一个始终返回None的函数作为最后一个参数传递给tryconvert(),就可以返回其他值。此“转换”将始终成功,因此如果没有其他转换工作,则会返回该值。如果你经常使用tryconvert,那么为了便于阅读,编写一个生成这些函数的辅助函数是很方便的:

def default(value):
    return lambda *a: value

parser.add_argument(
    '-v',
    dest='version',
    help="The version (latest/active/basic or numerical version)",
    required=False,
    default='latest',
    type=lambda v: tryconvert(v, int, default(None))
)