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

pol*_*ian 3 python pycharm argparse

该线程是先前版本的扩展,可以在此处找到。说,我有一个用于两个目的的代码: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)
Run Code Online (Sandbox Code Playgroud)

这些语句可以从终端执行

python test_file.py --output_dir data/xxxx 2 2 5 --sum
Run Code Online (Sandbox Code Playgroud)

但是,对于调试过程,我想跳过终端的用法。从这里可以找到hpaulj的想法,只是修改了

if __name__=='__main__': 
Run Code Online (Sandbox Code Playgroud)

进入

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

但是,我还想在调试过程中包括一个整数列表。同时包含整数和目录地址列表如下所示

args = argparse.Namespace(integers = "2 2 5", output_dir= 'mydata') 
Run Code Online (Sandbox Code Playgroud)

我可以知道我在哪里做错了。

提前致谢

jed*_*rds 5

通过将代码稍微更改为:

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)
Run Code Online (Sandbox Code Playgroud)

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

我们的输出是:

['test3.py','-output_dir','foo','1','2','3']
命名空间(accumulate = <内置函数求和>,整数= [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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

第二种方法的问题是双重的。首先,您将跳过调试过程中非常重要的部分,从而调试argparse配置并确保按预期方式解析参数。其次,必须在此处定义由argparse配置添加的隐式默认值(例如,--sumarguments / accumulate)。如果您采用第一种方法,则argparse将进行处理sys.argv并添加累加,而无需进行任何更改。在第二种方法中,我们必须添加accumulate=sum它以使其按预期运行。