关于python:为什么def main(argv = [__ name__])和if __name__ ==“__ main__”:sys.exit(main(sys.argv))?

Why def main(argv=[__name__]) and if __name__ == “__main__”: sys.exit(main(sys.argv))?

我正在编写一个代码,它首先定义了一个函数,如下所示:

1
2
3
4
def main(argv=[__name__]):
    ...
    *rest of code*
    ...

并以:

1
2
if __name__ =="__main__":
    sys.exit(main(sys.argv))

我的印象是,这样做的目的是检查以确保脚本是从命令行执行的,然后使用退出python时提供的参数运行函数main。但是,为什么需要在函数定义中将变量argv预设为[__name__]?这不是我的代码,所以我不知道这背后的初衷。不过,我对使用if __name__ =="__main__":行来抽查命令行执行情况还不是很熟悉,所以可能有一些明显的原因导致了这种语法的缺失。如有任何帮助或有关main函数定义和参数/命令行与模块测试的进一步细节,我们将不胜感激。


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

main函数与python无关,只是一些约定(源自C等语言)。sys.exit(main(sys.argv))将触发sys.exit函数,其退出代码相当于使用接收到的命令行参数运行main函数的结果。main可能应该返回一个适当的退出代码(0表示OK,其他表示各种异常)。


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

另一种受支持的用法可能是从另一个python程序调用它,如下所示:

1
2
import your_module
your_module.main()


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

默认值是确保当导入文件而不是直接运行时,argv[0]中有类似的内容。在本例中,它是模块的名称。