代码之家  ›  专栏  ›  技术社区  ›  mpx

调试时模拟argparse命令行参数输入

  •  1
  • mpx  · 技术社区  · 7 年前

    此线程是上一个线程的扩展,可以找到 here . 比如,我有一个代码有两个用途,1)从整数列表中打印一个最大值;2)创建一个新目录。

    import argparse
    import os
    
    parser = argparse.ArgumentParser()
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                        help='an integer for the accumulator')
    
    parser.add_argument('--sum', dest='accumulate', action='store_const',
                        const=sum, default=sum,
                        help='sum the integers (default: find the max)')
    
    parser.add_argument("--output_dir", type=str, default="data/xx")
    
    def main(args):
        os.makedirs(args.output_dir)
        print args.accumulate(args.integers)
    
    if __name__=='__main__':
        args = parser.parse_args()  # Disable during debugging @ Run through terminal
        # args = argparse.Namespace(integers = 1, output_dir= 'mydata_223ss32')  # Disable when run through terminal: For debugging process
        main(args)
    

    这些语句可以通过以下方式从终端执行:

    python test_file.py --output_dir data/xxxx 2 2 5 --sum
    

    但是,对于调试过程,我想跳过终端的使用。这个想法是由 hpaulj 从中可以找到 在这里 只是简单地修改了

    if __name__=='__main__': 
    

    进入之内

    if __name__=='__main__':
        args = argparse.Namespace(output_dir= 'mydata')  # Disable when run through terminal: For debugging process
        main(args)
    

    但是,我还希望在调试过程中包含一个整数列表。包括整数和目录地址列表,如下所示,输出一个错误

    args = argparse.Namespace(integers = "2 2 5", output_dir= 'mydata') 
    

    我能知道我在哪里做错了吗?

    提前谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   jedwards    7 年前

    通过将代码稍微更改为:

    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                        help='an integer for the accumulator')
    
    parser.add_argument('--sum', dest='accumulate', action='store_const',
                        const=sum, default=sum,
                        help='sum the integers (default: find the max)')
    
    parser.add_argument("--output_dir", type=str, default="data/xx")
    
    def main(args):
        #os.makedirs(args.output_dir)              # XXX: Commented out for debugging
        print(args.accumulate(args.integers))
    
    if __name__=='__main__':
        print(sys.argv)
        args = parser.parse_args()  # Disable during debugging @ Run through terminal
        # args = argparse.Namespace(integers = 1, output_dir= 'mydata_223ss32')  # Disable when run through terminal: For debugging process
        print(args)
        main(args)
    

    我们可以看到,如果调用脚本时使用: ./test3.py --output_dir foo 1 2 3

    我们的产出是:

    ['test3.py', '--output_dir', 'foo', '1', '2', '3']
    Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3], output_dir='foo')
    6
    

    因此,如果要模拟命令行参数,则有两个选项:

    1)编辑 sys.argv (个人首选):

    if __name__=='__main__':
        # Override sys.argv
        sys.argv = ['test3.py', '--output_dir', 'foo', '1', '2', '3']
        args = parser.parse_args()
        main(args)
    

    2)创建 Namespace 对象:

    if __name__=='__main__':    
        #args = parser.parse_args()  # Disable during debugging @ Run through terminal
        args = argparse.Namespace(accumulate=sum, integers=[1,2,3], output_dir='foo')
        main(args)
    

    第二种方法的问题是双重的。首先,通过这样做,您将跳过调试过程中非常重要的一部分,调试argparse配置,并确保按预期解析参数。其次,必须在此处定义argparse配置添加的隐式默认值(例如 --sum 论点/ accumulate )。如果采用第一种方法,argparse将处理 系统参数 并且不需要做任何更改就可以添加累积。在第二种方法中,我们必须 accumulate=sum 让它按预期运行。