为什么def main(argv = [__ name__])和if __name__ ==" __ main __":sys.exit(main(sys.argv))?

时间:2017-01-04 22:00:13

标签: python command-line sys

我正在使用/重写首先定义函数的代码,如下所示:

def main(argv=[__name__]):
    ...
    *rest of code*
    ...

并以:

结束
if __name__ == "__main__":
    sys.exit(main(sys.argv))

我的印象是,这样做是检查以确保脚本是从命令行执行的,然后运行函数main,并在退出python时提供参数。但是,为什么有必要在函数定义中将变量argv预设为[__name__]?这不是我的代码,所以我不知道这背后的初衷。但是,我是使用if __name__ == "__main__":行检查命令行执行的新手,所以可能有一些明显的原因导致我错过了这种语法。有关main函数定义和参数/命令行与模块测试的任何帮助或更多详细信息将不胜感激。

3 个答案:

答案 0 :(得分:1)

main()定义允许以除文件底部的main()行之外的其他方式调用sys.exit()。这可能是防御性编程的一个示例,也可能表示此文件的其他受支持用途。

其中一个受支持的用途可能是从另一个Python程序调用它,如:

import your_module
your_module.main()

答案 1 :(得分:1)

对于argv=[__name__],原始开发者可能希望保留运行此函数的选项,而不是从命令行运行(即由另一个模块调用),并提供__name__,因为它使用sys.argv[0] 1}}用于某些功能。

main函数与python无关,只是一些约定(源自C之类的语言)。 sys.exit(main(sys.argv))将触发sys.exit函数,退出代码等同于使用接收到的命令行参数运行main函数的产品。 main可能应返回适当的退出代码(0表示正常,其他则表示各种例外情况。)

答案 2 :(得分:0)

从CLI运行脚本时,argv[0]是脚本的名称,argv的其余部分是命令行参数。因此,main()的其余部分可能会期望argv[0]始终被填充。

默认值是确保argv[0]在导入文件时具有类似的内容,而不是直接运行。在这种情况下,它是模块的名称。