pol*_*ian 7 python pycharm argparse
我可以知道调试 argpars 函数的最佳实践是什么。
\n\n假设我有一个 py 文件 test_file.py ,其中包含以下几行
\n\n# Script start\nimport argparse\nimport os\nparser = argparse.ArgumentParser()\nparser.add_argument(\xe2\x80\x9c\xe2\x80\x93output_dir\xe2\x80\x9d, type=str, default=\xe2\x80\x9d/data/xx\xe2\x80\x9d)\nargs = parser.parse_args()\nos.makedirs(args.output_dir)\n# Script stop\nRun Code Online (Sandbox Code Playgroud)\n\n可以通过以下方式从终端执行上述脚本:
\n\npython test_file.py \xe2\x80\x93output_dir data/xx\nRun Code Online (Sandbox Code Playgroud)\n\n但是,对于调试过程,我想避免使用终端。因此解决方法是
\n\n# other line were commented for debugging process\n# Thus, active line are\n# Script start\nimport os\nargs = {\xe2\x80\x9coutput_dir\xe2\x80\x9d:\xe2\x80\x9ddata/xx\xe2\x80\x9d}\nos.makedirs(args.output_dir)\n#Script stop\nRun Code Online (Sandbox Code Playgroud)\n\n但是,我无法执行修改后的脚本。我可以知道我错过了什么吗?
\n当用作脚本时,parse_args将生成一个Namespace对象,该对象显示为:
argparse.Namespace(output_dir='data/xx')\nRun Code Online (Sandbox Code Playgroud)\n\n然后
\n\nargs.output_dir\nRun Code Online (Sandbox Code Playgroud)\n\n将是该属性的值
\n\n在测试中,您可以做以下几件事:
\n\nargs = parser.parse_args([....]) # a 'fake' sys.argv[1:] list\n\nargs = argparse.Namespace(output_dir= 'mydata')\nRun Code Online (Sandbox Code Playgroud)\n\n并像以前一样使用args。或者直接致电
os.makedirs('data/xx')\nRun Code Online (Sandbox Code Playgroud)\n\n我建议将脚本组织为:
\n\n# Script start\nimport argparse\nimport os\n# this parser definition could be in a function\nparser = argparse.ArgumentParser()\nparser.add_argument(\xe2\x80\x9c\xe2\x80\x93output_dir\xe2\x80\x9d, type=str, default=\xe2\x80\x9d/data/xx\xe2\x80\x9d)\n\ndef main(args):\n os.makedirs(args.output_dir)\n\nif __name__=='__main__':\n args = parser.parse_args()\n main(args)\nRun Code Online (Sandbox Code Playgroud)\n\n这样,parse_args导入文件时就不会运行该步骤。无论您传递args Namespacetomain还是传递诸如args.output_dir、 或字典等值,都是您的选择。