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

15 投票
4 回答
38398 浏览
提问于 2025-04-18 02:16

我正在试着理解一些代码,这段代码是用来读取命令行参数的(见下文)。我想知道 "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:])

4 个回答

2

这是判断一个Python模块是作为脚本执行的,还是从其他模块导入的标准方法。只有当这个文件作为脚本执行时(也就是说,它是主模块),你才会进入if __name__ == "__main__"这个代码块。

5

在Python中,if __name__ == '__main__'这个写法是为了让你可以写一些既可以直接运行,又可以被其他代码引入的代码。

如果你把这个代码引入到其他地方使用,那么这个if里面的内容就不会被执行。如果你直接运行python.exe myscript.py,那么这个if里面的内容就会被执行。

6

这是为了单元测试的目的。

如果你直接运行这个脚本,它会执行if块里的内容。这样你就可以在这里进行一些单元测试的工作。但是如果你把这个文件当作模块导入,就不希望这一部分被执行。

这有点像Java里的主函数。在每个Java类中,你可以有一个主函数来进行单元测试。但是当这个类被作为模块导入或使用时,主函数就不会被执行。

一般来说,如果你直接使用这个脚本,它会运行if块里的内容。否则,有人可能会把这个文件当作函数或类的库来使用,而测试用例的名称确保这段代码不会打扰到用户。

24

想象一下,有人想在他们自己的程序里使用你写的模块里的功能。他们导入了你的模块,然后它就开始自己运行了!

但是,如果你在代码里加上 if __name__ == "__main__" 这一行,这种情况就不会发生。你的模块只有在作为主模块运行时才会“自己干活”。如果不是,它就像一个库一样,只提供功能。这种做法让代码更容易被重复使用。

(正如 Sheng提到的,你可能会想在另一个脚本里导入这个模块来进行测试。)

撰写回答