【问题标题】:argparse is not returning expected value for store_trueargparse 未返回 store_true 的预期值
【发布时间】:2019-08-31 07:01:18
【问题描述】:

我正在运行 Python 3.6.8 :: Anaconda custom(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())

我被骗了……

【问题讨论】:

  • sys.argv 不会是 ['-x', '-v'] 如果程序实际上是使用这些参数调用的:sys.argv[0] 将是程序名称,并且参数将从 [1] 开始。

标签: python-3.x argparse


【解决方案1】:

你的错误在这一行:

sys.argv = startup.split(' ')

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

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

【讨论】:

    【解决方案2】:

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

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

    您可以改为修改sys.argv[1:]。通过您的函数传递argv,您可以通过多种方式进行测试。

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2016-02-13
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2012-11-08
      相关资源
      最近更新 更多