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

问题描述 投票:0回答:2

此线程是上一个线程的扩展,可以在此处找到。 比如说,我有一个有两个目的的代码:

  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')
    
python pycharm argparse
2个回答
25
投票
将代码稍微更改为:

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'] 命名空间(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)

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 将处理 
sys.argv
 并添加累积,而无需进行任何更改。在第二种方法中,我们必须添加 
accumulate=sum
 才能使其按预期运行。


0
投票
向 [jedwards 答案][1] 添加更多信息:

我使用 pycharm 来实现相同的目的,我需要稍微改变 jedwards 命题,这样

sys.argv

 不会被覆盖而是被修改。应保留列表的第一个条目
sys.argv[0]
,因为它包含正在运行的文件的路径。如果不这样做,变量 
parser.prog
 就会变得混乱,因此不起作用。

无需像 jedwards 那样手动添加文件名作为第一个列表条目,您只需附加到

sys.argv

 并扩展列表即可:

if __name__=='__main__': # Append additional arguments to sys.argv sys.argv = sys.argv + ['--output_dir', 'foo', '1', '2', '3'] args = parser.parse_args() main(args)
这使得它能够适应文件名的更改。
[1]:

https://stackoverflow.com/a/50886791/7705525

© www.soinside.com 2019 - 2024. All rights reserved.