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函数定义和参数/命令行与模块测试的进一步细节,我们将不胜感激。
- 关于sys.exit()一点也不奇怪,我们已经(回答了!)我们知识库中关于这里使用的实践的问题,比较__name__和__main__。请考虑缩小您的问题范围,使其不再具有重复的部分;可以说,跨越预先回答的问题和未回答的问题使其"过于宽泛"。
- …其中一个例子:为什么使用def main()?
对于argv=[__name__],原始开发人员可能希望保留不从命令行(即由另一个模块调用)运行此函数的选项,并提供__name__,因为它使用sys.argv[0]来实现某些功能。
main函数与python无关,只是一些约定(源自C等语言)。sys.exit(main(sys.argv))将触发sys.exit函数,其退出代码相当于使用接收到的命令行参数运行main函数的结果。main可能应该返回一个适当的退出代码(0表示OK,其他表示各种异常)。
- 六羟甲基三聚氰胺六甲醚。。。有趣。原始代码在main()函数中根本不使用sys.arvg[0]或argv的任何元素。如果此函数是作为模块而不是作为命令行运行的,那么像这样定义argv是否可以确保main()函数始终使用作为模块调用此函数的脚本的命令行参数中特定的参数?
- 如果函数不使用argv,则将其用作参数没有意义。否则,您可以通过发送自定义参数来控制主要功能(或确保这些参数与默认的argv一起存在)。
main()定义允许以文件底部的sys.exit()行以外的其他方式调用main()的可能性。这可能是防御编程的一个例子,也可能表示该文件的其他支持用途。
另一种受支持的用法可能是从另一个python程序调用它,如下所示:
1 2
| import your_module
your_module.main() |
当从cli运行脚本时,argv[0]是脚本的名称,其余的argv是命令行参数。因此,main()的其余部分可能期望始终填写argv[0]。
默认值是确保当导入文件而不是直接运行时,argv[0]中有类似的内容。在本例中,它是模块的名称。