这样做做什么,为什么应该包括:if语句?

if __name__ == "__main__":
    print("Hello, World!")

如果你试图结束一个问题 如果你想要结束一个问题 在那里有人应该应该 使用这个学说,而不是,是不是, 考虑关闭作为 重复的为什么Python在我进口时 运行我的模块? 我该如何阻止它?。而对于某些问题,如果有人只是没有调用任何函数,或者错误地期望指定函数main自动用作切入点,使用当我启动 Python 脚本时, 主函数为何不运行? 脚本从哪里开始运行 ?.


当前回答

当你import具有此条件的代码, 它会返回False(除进口编码外),但将返回True将要运行的代码的代码 。

其他回答

下代码的代码if __name__ == '__main__':仅仅如果将模块作为脚本引用,则执行该模块。

例如,考虑以下模块my_test_module.py:

# my_test_module.py

print('This is going to be printed out, no matter what')

if __name__ == '__main__':
    print('This is going to be printed out, only if user invokes the module as a script')

第一种可能性:进口my_test_module.py在另一个模块中

# main.py

import my_test_module

if __name__ == '__main__':
    print('Hello from main.py')

如果你现在祈祷main.py:

python main.py

>> 'This is going to be printed out, no matter what'
>> 'Hello from main.py'

请注意,只有最高层print()语中的语中my_test_module执行。


第二种可能性:my_test_module.py作为脚本

现在,如果你现在跑my_test_module.py作为 Python 脚本, 两者print()将执行语句:

python my_test_module.py

>>> 'This is going to be printed out, no matter what'
>>> 'This is going to be printed out, only if user invokes the module as a script'

更全面的解释,可读作:什么是什么东西if __name__ == '__main__'在 Python 中做.

什么是if __name__ == "__main__":是吗?

概述基本内容:

  • 全局变量,__name__,在您的程序程序输入点的模块中,是'__main__'否则,它就是您导入模块的名称 。

  • 所以,代码在if块只当模块是程序输入点时才会运行。

  • 它允许模块中的代码可被其他模块导入,而不执行进口时的代码块。


为什么我们需要这个?

制定和测试您的守则

说你正在写一个Python脚本 设计成一个模块:

def do_important():
    """This function does something very important"""

你,你,你能够将函数的调用点添加到底部以测试模块 :

do_important()

并运行它,它有类似的东西:

~$ python important.py

问题

但是,如果您想要将模块导入到另一个脚本:

import important

进口时do_important函数将被调用, 所以您可能会评论 您的函数调用,do_important(),在底部。 ,在底部。

# do_important() # I must remember to uncomment to execute this!

然后你必须记住,你是否已经评论了自己的测试功能调用。 而这种额外的复杂性 将意味着你可能会忘记, 让你的发展进程更加麻烦。

更好的方法

缩略__name__变量指向命名空间, Python 解释器此时恰好在哪里。

在导入模块中,它是该模块的名称。

但在主模块(或互动的 Python 会话, 即口译员的读、 Eval、 打印圈或 REPL) 内, 您正在运行来自它的一切"__main__".

如果您在执行前检查 :

if __name__ == "__main__":
    do_important()

有了以上内容, 您的代码只有在运行为主模块时才会执行( 或者故意从其它脚本中调用它 ) 。

更好的办法

不过有种共音法可以改进

如果我们想从模块之外运行这个业务流程呢?

如果我们把代码放进去, 我们想在开发过程中练习, 在这样的功能中进行测试, 然后核对'__main__'紧接其后:

def main():
    """business logic for when running this module as the primary one!"""
    setup()
    foo = do_important()
    bar = do_even_more_important(foo)
    for baz in bar:
        do_super_important(baz)
    teardown()

# Here's our payoff idiom!
if __name__ == '__main__':
    main()

我们现在的模块末端有一个最终功能,如果我们将模块作为主模块运行,该功能将运行。

它将允许模块及其功能和类别输入到其他脚本,而不运行main函数, 并允许模块( 及其函数和类) 运行时调用该模块( 及其函数和类) 。'__main__'模块,即

import important
important.main()

在Python文件中,也可以找到这种语言,作为解释。__main__模块。案文规定:

本模块代表了口译员主要程序执行范围(否则是匿名的)——从标准输入、脚本文件或交互式提示读取的命令。正是在这个环境中,特殊“有条件脚本”的阶梯导致脚本运行:

if __name__ == '__main__':
    main()

if __name__ == "__main__":无法在导入文件时运行不需要的代码 。

例如,这是test1.pyif __name__ == "__main__"::

# "test1.py"

def hello()
    print("Hello")

hello()

还有test2.py进口test1.py:

# "test2.py"

import test1 # Here


然后,当奔跑的时候,test2.py, 1个Hello打印是因为不需要的代码hello()test1.py同时运行 :

python test2.py
Hello

当然,你可以打给test1.hello()test2.py:

# "test2.py"

import test1

test1.hello() # Here

然后,当奔跑的时候,test2, Hello已经打印 :

python test2.py
Hello
Hello

现在,添加if __name__ == "__main__":test1.py并放hello()在其之下:

# "test1.py"

def hello()
    print("Hello")

if __name__ == "__main__":
    hello()

这是test2.py:

# "test2.py"

import test1

test1.hello()

然后,当奔跑的时候,test2.py, 只有一个Hello打印是因为if __name__ == "__main__":防止要运行不需要的代码hello()何时test2.py进口进口进口test1.py:

python test2.py
Hello

此外,是否test1.py拥有if __name__ == "__main__":或非:

# "test1.py"

def hello()
    print("Hello")

if __name__ == "__main__":
    hello()
# "test1.py"

def hello()
    print("Hello")

hello()

一个Hello运行时正确打印test1.py:

python test1.py
Hello

当你import具有此条件的代码, 它会返回False(除进口编码外),但将返回True将要运行的代码的代码 。

Python 中每个模块的属性都称为属性__name__的值。__name__属性是__main__当模块直接运行时, 例如python my_module.py否则(就像你说的那样)import my_module)值的数值__name__是模块的名称。

简而言之,仅举一个小例子来解释。

脚本测试.py

apple = 42

def hello_world():
    print("I am inside hello_world")

if __name__ == "__main__":
    print("Value of __name__ is: ", __name__)
    print("Going to call hello_world")
    hello_world()

我们可以直接执行

python test.py

Output

Value of __name__ is: __main__
Going to call hello_world
I am inside hello_world

现在假设我们从另一个剧本中 将上述剧本称为:

脚本外部调用(_P).py

import test

print(test.apple)
test.hello_world()

print(test.__name__)

当你执行此操作时,

python external_calling.py

Output

42
I am inside hello_world
test

因此,以上不言自明地说明,当你们呼唤测试测试从另一个脚本, 如果循环__name__test.py将不执行。