'if __name__ == "__main__":' 的目的是什么?

15

我在尝试理解一段读取命令行参数的代码(如下所示)。我的疑问是"if __name__ == '__main__'"这行代码的用途是什么...

我为什么要使用那行代码,而不是直接使用下面的代码main(sys.argv[1:])。它提供了什么额外的用途?

import sys, getopt

def main(argv):
   inputfile = ''
   outputfile = ''
   try:
      opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
   except getopt.GetoptError:
      print 'test.py -i <inputfile> -o <outputfile>'
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print 'test.py -i <inputfile> -o <outputfile>'
         sys.exit()
      elif opt in ("-i", "--ifile"):
         inputfile = arg
      elif opt in ("-o", "--ofile"):
         outputfile = arg
   print 'Input file is "', inputfile
   print 'Output file is "', outputfile

if __name__ == "__main__":
   main(sys.argv[1:])

规范的问题是 *if name == "main": 该做什么?*(56个答案、7000个赞、5年前)。 - Peter Mortensen
4个回答

24

想象一下,如果有人想在自己的程序中使用你模块中的函数。他们导入你的模块...然后它开始做它自己的事情!

使用if __name__ == "__main__",这种情况就不会发生。只有当模块作为主模块运行时,它才会“做自己的事情”。否则它会像一个库一样工作。它通过使代码重用更加容易来鼓励代码重复利用。

(正如Sheng提到的那样,您可能希望自己将该模块导入到另一个脚本中进行测试。)


这可以补充 https://dev59.com/bHRC5IYBdhLWcg3wD87r?rq=1。 - Franz Kurt

6

这是用于单元测试的目的。

如果您直接运行此脚本,则会执行if块。因此,您可以在此处进行一些单元测试工作。但是,如果您将此文件作为模块导入,则不希望执行此部分。

这类似于Java中的main函数。在每个Java类中,您可以拥有一个用于单元测试的main函数。但是,如果该类被导入/用作模块,则不会执行main函数。

通常情况下,如果您直接使用此脚本,则会运行if块。否则,某些人想将此文件用作函数/类的库,并且测试用例名称确保此代码不会打扰用户。


5
在Python中,if __name__ == '__main__'约定用于编写可直接运行或导入的代码。如果你将其导入,那么if块不会被执行;如果你运行python.exe myscript.py,则会执行该代码块。

@Franz Kurt:为什么不呢? - Peter Mortensen

2

这是一种惯用的方法,用于判断Python模块是作为脚本执行还是从另一个模块导入。当文件作为脚本执行时(即它是主模块),您将只进入if __name__ == "__main__"代码块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接