在 python 中调试 argpars

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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
python test_file.py \xe2\x80\x93output_dir data/xx\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

hpa*_*ulj 3

当用作脚本时,parse_args将生成一个Namespace对象,该对象显示为:

\n\n
argparse.Namespace(output_dir='data/xx')\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后

\n\n
args.output_dir\n
Run Code Online (Sandbox Code Playgroud)\n\n

将是该属性的值

\n\n

在测试中,您可以做以下几件事:

\n\n
args = parser.parse_args([....])  # a 'fake' sys.argv[1:] list\n\nargs = argparse.Namespace(output_dir= 'mydata')\n
Run Code Online (Sandbox Code Playgroud)\n\n

并像以前一样使用args。或者直接致电

\n\n
os.makedirs('data/xx')\n
Run 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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,parse_args导入文件时就不会运行该步骤。无论您传递args Namespacetomain还是传递诸如args.output_dir、 或字典等值,都是您的选择。

\n