是否__ __ =='__ main__'执行了?

时间:2013-06-11 22:53:58

标签: python

如果直接运行模块,我的印象是只执行 name =' main '下面的代码。但是,我在该语句上面看到一行mr = MapReduct.MapReduce()?如何执行,以及将其置于if子句之上的原因是什么?

import MapReduce
import sys

"""
Word Count Example in the Simple Python MapReduce Framework
"""

mr = MapReduce.MapReduce()

if __name__ == '__main__':
  inputdata = open(sys.argv[1])
  mr.execute(inputdata, mapper, reducer)

3 个答案:

答案 0 :(得分:4)

当然,if __name__ == '__main__':之前的所有代码都会被执行。脚本从上到下进行处理,找到的每个表达式或语句按顺序执行。但是if __name__ == '__main__':行是特殊的:如果从命令行调用脚本,它将被运行。

按照惯例,if __name__ == '__main__':行放在最后,以确保它所依赖的所有代码到目前为止都已经过评估。

看看其他question,了解该行中发生了什么。

答案 1 :(得分:3)

文件中的所有内容都会被执行,但是你在__name__ == '__main__'之上放置的大多数内容只是函数或类定义 - 执行这些定义只是定义一个函数或类,并且不会产生任何明显的副作用。

例如,如果您在这些定义之外的文件中放置print语句,则会看到一些输出。

答案 2 :(得分:2)

是的,整个脚本都已执行。

我们拥有主要防守的原因是让您的程序既可以用作独立脚本(在这种情况下__name__变量定义为"__main__")或者从另一个python脚本导入为模块。在这种情况下,我们不希望运行任何代码,我们只希望代码的定义可供加载我们的人使用。

__main__守卫的一个典型用法是在python文件独立运行时运行单元测试。例如,让我们假设我们有文件mymodule.py

def my_function(foo):
  """This function will add 54 to foo.
  The following two lines are 'doctests' and can be run 
  automatically to show that the module's function work as expected.
  >>> my_function(6)
  60
  """
  return foo + 54

if __name__ == "__main__":
  import doctest
  doctest.testmod() # this will run all doctests in this file

如果我们现在在命令行上运行它,将运行测试以检查模块是否按预期工作。

现在,我们可以从另一个文件或命令行导入mymodule.py

>>> import mymodule # Note that the tests will not be run when importing
>>> mymodule.my_function(3)
57

测试将无法运行,因为导入脚本时__name__变量不会是__main__

您可以使用简单文件(test.py)测试:

➤ cat test.py
#!/usr/bin/env python
print("my name is: ", __name__)    
➤ python test.py 
my name is:  __main__
➤ python
Python 3.3.1 (default, Apr  6 2013, 19:11:39) 
[GCC 4.8.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
my name is:  test
>>>