我试图理解我发现的一些代码读取命令行参数的代码(附在下面)。我关注的是"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:])
答案 0 :(得分:10)
好吧,想象一下其他人想在自己的程序中使用模块中的函数。他们导入你的模块......它开始做自己的事情!
使用if __name__ == "__main__"
,这不会发生。你的模块只是&#34;做它的事情&#34;如果它作为主模块运行。否则它就像一个库。它通过简化代码来鼓励代码重用。
(正如@Sheng提到的,您可能希望自己将模块导入另一个脚本以进行测试。)
答案 1 :(得分:1)
用于单元测试建议。
如果您直接运行此脚本,它将执行if
块。所以你可以在这里做一些单元测试工作。但是,如果要将此文件作为模块导入,则不希望执行此部分。
它类似于Java中的主要功能。在每个Java类中,您都可以拥有单元测试的主要功能。但是类被导入/用作模块,主函数不会被执行。
通常,如果您直接使用此脚本,它将运行if
块。否则,有人希望将此文件用作函数/类的库,测试用例 name 可确保此代码不会打扰用户。
答案 2 :(得分:1)
Python中的if __name__ == '__main__'
约定旨在允许您编写可以直接运行或导入的代码。
如果导入它,则不会执行if
块。如果你运行python.exe myscript.py
,那就是。
答案 3 :(得分:1)
这是判断Python模块是作为脚本执行还是从其他模块导入的惯用方法。如果文件作为脚本执行(也就是主模块),则只会输入if __name__ == "__main__"
块。