【问题标题】:Purpose of 'if __name__ == "__main__":' [duplicate]'if __name__ == "__main__":' 的目的 [重复]
【发布时间】:2014-05-24 20:53:10
【问题描述】:

我试图理解一些我发现的读取命令行参数的代码(附在下面)。我关心的是"if __name__ == __main__"line 的用途是什么......

我为什么要使用该行而不是仅使用下面的代码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:])

【问题讨论】:

标签: python main


【解决方案1】:

好吧,假设其他人想在他们自己的程序中使用您模块中的函数。他们导入你的模块......它开始做自己的事情!

if __name__ == "__main__" 不会发生这种情况。如果你的模块作为 main 模块运行,它只会“做它的事情”。否则它就像一个图书馆。它通过简化代码重用来鼓励代码重用。

(作为Sheng mentions,您可能希望自己将模块导入另一个脚本以进行测试。)

【讨论】:

【解决方案2】:

这是为单元测试提出的。

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

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

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

【讨论】:

    【解决方案3】:

    Python 中的if __name__ == '__main__' 约定旨在让您编写可以直接运行或导入的代码。

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

    【讨论】:

    • @Franz Kurt:为什么不呢?
    【解决方案4】:

    这是判断 Python 模块是作为脚本执行还是从另一个模块导入的惯用方式。如果文件作为脚本执行(又名,它是主模块),您只会输入if __name__ == "__main__" 块。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2021-12-25
      • 2018-11-22
      相关资源
      最近更新 更多