如何在Python同文件内使用argparse传递自定义参数?
如何在Python同文件内使用argparse传递自定义参数?
嘿,我一眼就看出问题所在啦——你给main函数传了自定义参数,但你的argparse完全没接住!默认情况下parser.parse_args()会自动读取命令行里的sys.argv[1:],你手动传给main的['--data_dir', 'data/non']根本没被它用到,所以才一直输出默认值data/text。
给你推荐最实用的解决办法,还能轻松支持多参数:
核心思路:让argparse接收你传入的参数列表
修改你的main函数,让它可以接收一个可选的参数列表参数,然后把这个列表传给parse_args()。这样既支持命令行直接运行脚本,也支持在文件内手动调用main传自定义参数,一举两得。
完整示例代码:
import argparse def main(args_list=None): parser = argparse.ArgumentParser() # 定义第一个参数 parser.add_argument("--data_dir", default='data/text', type=str, help="The input data dir. Should contain the .tsv files (or other data files) for the task.") # 再加一个参数示例,演示多参数支持 parser.add_argument("--batch_size", default=32, type=int, help="Batch size for processing data.") # 关键:如果传入了自定义参数列表就用它,否则用默认的命令行参数 args = parser.parse_args(args_list) print(f"data_dir: {args.data_dir}") print(f"batch_size: {args.batch_size}") return args if __name__ == "__main__": # 场景1:命令行运行脚本时,直接调用main(),会自动读取终端传入的参数 # 比如终端输入:python your_script.py --data_dir data/test --batch_size 16 # main() # 场景2:文件内手动调用,传入自定义参数列表 results = main(['--data_dir', 'data/non', '--batch_size', '64'])
运行这段代码,你会看到输出的data_dir是data/non,batch_size是64,完全符合你的预期。
补充:另一种不推荐的方法(修改sys.argv)
如果你不想改动main函数的结构,也可以手动修改sys.argv来欺骗argparse,不过这种方法不够灵活,代码可读性也差,只做个补充参考:
import argparse import sys def main(): parser = argparse.ArgumentParser() parser.add_argument("--data_dir", default='data/text', type=str, help="The input data dir. Should contain the .tsv files (or other data files) for the task.") args = parser.parse_args() print(args.data_dir) if __name__ == "__main__": # 手动替换sys.argv,让argparse读取我们指定的参数 sys.argv = ['dummy_name.py', '--data_dir', 'data/non'] main()
还是强烈推荐第一种方法,后续加新参数只需要在add_argument里加一行,调用时传对应的参数就行,非常方便。
备注:内容来源于stack exchange,提问作者Lunaria
相关产品推荐
相关产品推荐

