argparse没有返回store_true的期望值

时间:2019-04-09 22:11:55

标签: python-3.x argparse

我正在运行Python 3.6.8 :: Anaconda自定义(64位),并且从argparse获得了奇怪的结果。尽管带有-x,但trainandexecute = False的值

def get_parameters():
    startup = '-x -b'
    sys.argv = startup.split(' ')
    ap = argparse.ArgumentParser()
    ap.add_argument('-x',       '--trainandexecute', action='store_true')
    ap.add_argument('-b',       '--debug',           action='store_true')
    ap.add_argument('-d',       '--rundate',         action='store')
    print(ap.parse_args())
    return vars(ap.parse_args())
get_parameters()

这将返回以下输出。请注意,尽管带有-x标志,trainandexecute = False。

Namespace(debug=True, execute=False, train=False, trainandexecute=False)
{'train': False,
 'execute': False,
 'trainandexecute': False,
 'debug': True}

但是,此测试可在下一个Jupyter单元中使用,并且它不是我的环境:

def get_test_parameters():
    startup = '-b -x'
    sys.argv = startup.split(' ')
    print(sys.argv)
    ap = argparse.ArgumentParser()
    ap.add_argument('-x',       '--x',         action='store_true')
    ap.add_argument('-b',       '--debug',     action='store_true')
    print(ap.parse_args())
    return vars(ap.parse_args())

所以输出:

get_test_parameters()

是:

['-b', '-x']                   # print(sys.argv)
Namespace(debug=False, x=True) # print(ap.parse_args())
{'x': True, 'debug': False}    # return vars(ap.parse_args())

我被刺伤了...

2 个答案:

答案 0 :(得分:3)

您的错误在这一行:

sys.argv = startup.split(' ')

sys.argv中的第一个值被视为脚本的名称,而不是选项。尝试运行ap.parse_args(startup.split())-您会看到正确的答案。

顺便说一句,不要将任何参数传递给split()。如果您通过" "并且连续空格超过一个,则分割结果将为空字符串。

答案 1 :(得分:1)

这是一个更好的测试框架:

Jr.

您可以改为修改/([A-Za-z ',-]+\.?)/ 。通过在函数中传递def get_parameters(argv=None): ap = argparse.ArgumentParser() ap.add_argument('-x', '--trainandexecute', action='store_true') ap.add_argument('-b', '--debug', action='store_true') ap.add_argument('-d', '--rundate', action='store') args = ap.parse_args(argv)) # if None, parses sys.argv[1:] print(args) return vars(args) get_parameters('-x -b'.split()) ,您可以测试几种方法。