关于python: ‘if __name__ == “__main__”:’ 的目的

Purpose of 'if __name__ == “__main__”:'

本问题已经有最佳答案,请猛点这里访问。

我试图理解我发现的一些代码,这些代码读取命令行参数(附在下面)。我担心的是,"if __name__ == __main__"线的目的是什么……

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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__"来说,这种情况不会发生。只有当模块作为主模块运行时,模块才会"执行其操作"。否则,它就像一个图书馆。它通过简化代码的使用来鼓励代码的重用。

(正如@sheng提到的,为了测试的目的,您可能需要将模块导入到另一个脚本中。)


这是判断Python模块是作为脚本执行还是从另一个模块导入的惯用方法。如果文件是作为脚本执行的(也就是说,它是主模块),则只需输入if __name__ =="__main__"块。


python中的if __name__ == '__main__'约定允许您编写可以直接运行或导入的代码。

如果导入,则不会执行该if块。如果你运行python.exe myscript.py,它就是。


用于单元测试建议。

如果您直接运行这个脚本,它将执行if块。所以你可以在这里做一些单元测试工作。但是,如果要将此文件作为模块导入,则不希望执行此部分。

它类似于Java中的主要功能。在每一个Java类中,都可以有一个单元测试的主函数。但是类是作为模块导入/使用的,不会执行主函数。

通常,如果您直接使用这个脚本,它将运行if块。否则,有人会将此文件用作函数/类的库,并且测试用例名称确保此代码不会影响用户。