在 python 中调试 argpars

Posted

技术标签:

【中文标题】在 python 中调试 argpars【英文标题】:debugging argpars in python 【发布时间】:2018-11-25 15:26:03 【问题描述】:

我想知道调试 argpars 函数的最佳做法是什么。

假设我有一个 py 文件 test_file.py,其中包含以下几行

# Script start
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument(“–output_dir”, type=str, default=”/data/xx”)
args = parser.parse_args()
os.makedirs(args.output_dir)
# Script stop

以上脚本可以通过以下方式从终端执行:

python test_file.py –output_dir data/xx

但是,对于调试过程,我想避免使用终端。因此解决方法是

# other line were commented for debugging process
# Thus, active line are
# Script start
import os
args = “output_dir”:”data/xx”
os.makedirs(args.output_dir)
#Script stop

但是,我无法执行修改后的脚本。我可以知道我错过了什么吗?

【问题讨论】:

你用什么写的?您的代码中有弯引号和破折号。如果您使用文字处理器而不是文本编辑器,那么这对编程来说是个坏主意。 argsNamespace 对象,而不是 dict。但是,对于调试,您可以简单地将参数的显式列表传递给parse_args,例如args = parser.parse_args(["output_dir", "data/xx"]) 嗨@chepner 感谢您的意见。但是我可以知道如何为具有不同类问题的多个输入实现这一点。我已经在新的thread 中发布了这个问题。提前致谢 【参考方案1】:

当用作脚本时,parse_args 会产生一个Namespace 对象,显示为:

argparse.Namespace(output_dir='data/xx')

然后

args.output_dir

将是该属性的值

在测试中你可以做几件事:

args = parser.parse_args([....])  # a 'fake' sys.argv[1:] list

args = argparse.Namespace(output_dir= 'mydata')

并像以前一样使用args。或者干脆调用

os.makedirs('data/xx')

我建议将脚本组织为:

# Script start
import argparse
import os
# this parser definition could be in a function
parser = argparse.ArgumentParser()
parser.add_argument(“–output_dir”, type=str, default=”/data/xx”)

def main(args):
    os.makedirs(args.output_dir)

if __name__=='__main__':
    args = parser.parse_args()
    main(args)

这样parse_args 步骤在文件导入时不会运行。是否将args Namespace 传递给main 或传递args.output_dir 之类的值,或字典等,都是您的选择。

【讨论】:

嗨@hpaulj,感谢您的意见。虽然您的建议适用于单个输入,但我在为具有不同类问题的多个输入实现它时遇到了困难。我将问题发布在一个新线程中,可以在链接link中找到【参考方案2】:

你可以在 shell 脚本中编写它来做你想做的事

重击:

#!/usr/bin/

cd /path/to/my/script.py
python script.py --output_dir data/xx 

如果这还不够,您可以将 args 存储在 json 配置文件中

configs.json

"output_dir": "data/xx"

要抓住它们:

import json
with open('configs.json', 'rb') as fh:
    args = json.loads(fh.read())

output_dir = args.get('output_dir')

# 'data/xx'

请注意 json 文件中键和值周围的双引号

【讨论】:

感谢您的意见。欣赏它。

以上是关于在 python 中调试 argpars的主要内容,如果未能解决你的问题,请参考以下文章

python测试与调试提示

调试 python 在 Eclipse ( pydev ) 中终止

在 Eclipse 中调试 Python 扩展

在 python 中调试 argpars

调试在 Docker 中运行的 python 应用程序

如何在Python自己的调试器(PDB)中执行多行语句