问题
很多深度学习项目采用shell文件保存命令行参数,并通过shell脚本来运行项目中的模型训练、测试等工作,但是在学习他人项目的过程中,直接在shell命令行运行脚本,不利于debug和学习代码的细节,此时,我们更希望在IDE(如Pycharm)中能以Debug的方式运行,直接在IDE中运行shell脚本的py文件会出错,提示命令行参数的用法,所以就要想办法快速绕过这一步,能够直接实现在IDE中运行,很容易想到直接在py文件中指定参数,但是使用argparse
的add_argument
方法手工将所有参数在py文件中重新定义一遍,不仅代码量多而且容易出错也不便于配置的更改,有没有更高效便捷的方式呢?有。
解决方法
一个简单高效的方式是在第一次运行shell脚本时将命令行参数的解析结果保存在本地文件中,之后在IDE运行时,直接从本地文件加载参数即可,下面通过一段示例代码说明。
示例代码
from argparse import ArgumentParser
import json
parser = ArgumentParser()
parser.add_argument('--seed', type=int, default=8)
parser.add_argument('--resume', type=str, default='a/b/c.ckpt')
parser.add_argument('--surgery', type=str, default='190', choices=['190', '417'])
args = parser.parse_args()
with open('commandline_args.txt', 'w') as f:
json.dump(args.__dict__, f, indent=2)
parser = ArgumentParser()
args = parser.parse_args()
with open('commandline_args.txt', 'r') as f:
args.__dict__ = json.load(f)
print(args)
第一次运行shell脚本时将参数解析结果args
保存在commandline_args.txt
中,之后在IDE运行时,将命令行参数解析的代码注释掉,直接从commandline_args.txt
中加载参数内容,并给args
变量的__dict__
属性赋值即可,如果要改动配置,直接改动commandline_args.txt
文件中的内容即可,如下图:
好了,现在用上这个方法愉快地去学习代码吧。
参考资料