这是什么,为什么应该包括一个 if 声明?
if __name__ == "__main__":
print("Hello, World!")
如果你试图关闭一个问题,有人应该使用这个字符,而不是,考虑关闭作为一个复制为什么Python在我进口时运行我的模块,而我如何停止它? 问题,有人只是没有呼叫任何功能,或者错误地等待一个名为主的功能将自动作为一个输入点,使用为什么没有主()功能运行。
这是什么,为什么应该包括一个 if 声明?
if __name__ == "__main__":
print("Hello, World!")
如果你试图关闭一个问题,有人应该使用这个字符,而不是,考虑关闭作为一个复制为什么Python在我进口时运行我的模块,而我如何停止它? 问题,有人只是没有呼叫任何功能,或者错误地等待一个名为主的功能将自动作为一个输入点,使用为什么没有主()功能运行。
当前回答
当您执行模块(源文件)时,条件是否检查模块是否直接被召唤或从另一个源文件被召唤。
如果直接呼吁执行,则模块名称将设置为“主”,然后在如果区块内的代码将执行。
其他回答
在 Python 中,每个模块都有一个特殊的属性,称为 __name__. 当模块作为主程序(例如,运行 python foo.py)时, __name__ 属性的值设置为“__main__”。
否则, __name__ 的值将设置到它被召唤的模块的名称。
如果 __name__ ==“__main__”:该怎么办?
__name__ 是一个全球变量(在 Python 中,全球实际上意味着在模块层面)存在于所有名称空间。
作为唯一的特殊情况,但是,在任何Python过程你运行,如 mycode.py:
python mycode.py
否则匿名的全球名称空间将“__main__”的值归咎于其 __name__。
因此,包括最后的线条
if __name__ == '__main__':
main()
在您的 mycode.py 脚本的结尾,当它是由 Python 过程运行的主要输入点模块时,
将使您的脚本独特定义的主要功能运行。
使用此构造的另一个好处:您也可以将代码作为一个模块进口到另一个脚本,然后运行主功能,如果和当您的程序决定:
import mycode
# ... any amount of other code
mycode.main()
考虑一下:
if __name__ == "__main__":
main()
它检查Python脚本的 __name__属性是否是“__main__”。换句话说,如果程序本身执行,属性将是 __main__,因此程序将执行(在这种情况下,主()函数)。
但是,如果您的 Python 脚本是由一个模块使用的,任何代码外的,如果声明将执行,所以如果 __name__ ==“__main__”是用来检查程序是否作为一个模块使用,因此决定是否运行代码。
除了已经提供的信息,如果 __name__ ==“__main__”:技术也是一个很好的方式来确保您的最小和最单一的脚本仍然运行,如果你偶然用Python而不是Python(或Python -m最单一)。
def test_assert():
assert 1 + 2 == 3
if __name__ == "__main__":
import pytest
pytest.main([__file__])
import unittest
class Tests(unittest.TestCase):
def test_assert(self):
self.assertTrue(1 + 2 == 3)
if __name__ == "__main__":
unittest.main()
然后,你的脚本与 Python 呼叫相同,就像 Python -m 最单一的呼叫一样。
现在,如果你也想确保所有的麻烦被转移到问答,如果用Python打电话? 或者,如果你也想添加额外的麻烦? 这里有一个例子如何做到这一点:
def test_assert():
assert 1 + 2 == 3
if __name__ == "__main__":
from pytest import main
from sys import argv
main([*argv, "-s"])
现在,您的 python -v --html=report.html 将具有与 pytest -v --html=report.html 等相同的效果,这是一个很好的方式来确保脚本仍然按照意图运行,即使不与预期的 pytest 或 python -m 最单一的通话运行。
当您互动运行Python时,本地 __name__ 变量被分配为 __main__ 的值。 同样,当您从命令行中执行一个Python 模块时,而不是将其导入到另一个模块时,其 __name__ 属性被分配为 __main__ 的值,而不是模块的实际名称。
if __name__ == '__main__':
# Do something appropriate here, like calling a
# main() function defined elsewhere in this module.
main()
else:
# Do nothing. This module has been imported by another
# module that wants to make use of the functions,
# classes and other useful bits it has defined.