如何在命令行上运行具有不同输入可能性的python程序

时间:2013-06-08 14:08:33

标签: python python-2.7

如果用户不知道c并且a = 3且b = 2,我想调用这样的程序:

$ python my_program 3 2

如果用户知道c并且c = 9我想调用这样的程序:

$ python my_program -c 6

由于c = results.a + results.b表示的计算大约需要30分钟,所以如果c已知,我希望能够跳过它。

这可能吗?我在下面有两个不同的代码示例,但这不是我想要的。

代码示例1

import argparse

def my_function():

    if results.c == 0:
        c = results.a + results.b
        d = c + 5

    else:
        d = results.c + 5


if __name__=='__main__':

    parser = argparse.ArgumentParser()

    parser.add_argument('a', action="store", type=int)
    parser.add_argument('b', action="store", type=int)
    parser.add_argument('-c', action="store", default=0, type=int)

    results = parser.parse_args()

    my_function()

我的代码示例1所需的调用是:

$ python my_program 3 2

$ python my_program 3 2 -c 6

代码示例2

import argparse

def my_function():

    if results.c == 0:
        c = results.a + results.b
        d = c + 5

    else:
        d = results.c + 5


if __name__=='__main__':

    parser = argparse.ArgumentParser()

    parser.add_argument('-a', action="store", default=0, type=int)
    parser.add_argument('-b', action="store", default=0, type=int)
    parser.add_argument('-c', action="store", default=0, type=int)

    results = parser.parse_args()

    my_function()

我的代码示例2所需的调用将是:

$ python my_program -a 3 -b 2

$ python my_program -c 6

感谢您的帮助。祝你有美好的一天。

1 个答案:

答案 0 :(得分:3)

您必须使所有参数都可选,并自行验证:

ap=argparse.ArgumentParser()

ap.add_argument('-c', required=False)
ap.add_argument('a', nargs='?')
ap.add_argument('b', nargs='?')

args = ap.parse_args()

if (args.c is not None):
    # process c
elif (args.a is not None and args.b is not None):
    # process a and b
else:
    # validation errors

如果您愿意将ab作为单个命名参数而不是位置参数,则可以使用mutual exclusion为您执行此操作。互斥组要求其中的所有参数都是可选的,并且只能要求命名参数。

ap=argparse.ArgumentParser()

g = ap.add_mutually_exclusive_group(required=True)
g.add_argument('-ab', nargs=2, required=False)
g.add_argument('-c', required=False)

args = ap.parse_args()

print('args={}'.format(repr(args)))

if (args.c is not None):
    # process c
elif (args.ab is not None):
    a, b = args.ab
    # process a and b
else:
    raise Exception("should never get here")