if __name__ == "__main__":' 的作用是什么?
我正在试着理解一些代码,这段代码是用来读取命令行参数的(见下文)。我想知道 "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 个回答
这是判断一个Python模块是作为脚本执行的,还是从其他模块导入的标准方法。只有当这个文件作为脚本执行时(也就是说,它是主模块),你才会进入if __name__ == "__main__"
这个代码块。
在Python中,if __name__ == '__main__'
这个写法是为了让你可以写一些既可以直接运行,又可以被其他代码引入的代码。
如果你把这个代码引入到其他地方使用,那么这个if
里面的内容就不会被执行。如果你直接运行python.exe myscript.py
,那么这个if
里面的内容就会被执行。
这是为了单元测试的目的。
如果你直接运行这个脚本,它会执行if
块里的内容。这样你就可以在这里进行一些单元测试的工作。但是如果你把这个文件当作模块导入,就不希望这一部分被执行。
这有点像Java里的主函数。在每个Java类中,你可以有一个主函数来进行单元测试。但是当这个类被作为模块导入或使用时,主函数就不会被执行。
一般来说,如果你直接使用这个脚本,它会运行if
块里的内容。否则,有人可能会把这个文件当作函数或类的库来使用,而测试用例的名称确保这段代码不会打扰到用户。
想象一下,有人想在他们自己的程序里使用你写的模块里的功能。他们导入了你的模块,然后它就开始自己运行了!
但是,如果你在代码里加上 if __name__ == "__main__"
这一行,这种情况就不会发生。你的模块只有在作为主模块运行时才会“自己干活”。如果不是,它就像一个库一样,只提供功能。这种做法让代码更容易被重复使用。
(正如 Sheng提到的,你可能会想在另一个脚本里导入这个模块来进行测试。)