if __name__ == ‘__main__’ python

if __name__ == '__main__' python

关于这个我已经读了很多文章了

1
if __name__ == '__main__'

但没拿到……我要和你分享代码,请你简单解释一下。

我创建了一个文件"ab.py"

1
2
3
4
def a():
    print('A function in ab file');

a()

第二个文件是"xy.py"

1
2
3
4
5
6
7
8
9
10
import ab

def b():
    print('b function')

def x(): print ('s');

x()

if __name__ =="__main__" :b()

当我执行这个代码时,这个输出就来了

1
2
3
A function in ab file
s
b function

现在我想知道这意味着什么,这段代码实际上是做什么的,为什么我们要实现它?我们的代码在没有它的情况下也可以工作

1
if __name__ =="__main__" :b()


当显式运行文件时,将运行在if __name__ == '__main__':之后的任何内容。

1
python myfile.py

但是,如果您在其他地方进口myfile.py

1
import myfile

不会调用if __name__ == '__main__':下的任何内容。

你应该养成经常使用这个的习惯。


理解此语句的一个非常简单的示例如下:

假设我们有下面的python脚本名为:"using ou name.py":

1
2
3
4
5
6
# Filename: using_name.py

if __name__ == '__main__':
    print 'This program is being run by itself'
else:
    print 'I am being imported from another module'

现在,试着做以下两件事,看看会发生什么:

1)直接运行脚本

1
$ python using_name.py

结果

1
This program is being run by itself

2)导入脚本

1
2
$ python
import using_name

结果

1
I am being imported from another module


What is actually doing this code?

Ok.

执行xy.py时,导入ab。import语句在导入时运行模块,因此ab的操作在xy的其余部分之前执行。完成ab后,继续xy。好的。

解释器跟踪哪些脚本与__name__一起运行。当你运行一个脚本时——不管你给它起了什么名字——解释器都会称它为"__main__"。这就是它如何跟踪哪个脚本是主文件,在外部调用另一个脚本后返回到哪个脚本。(你可能会说,"home"脚本)从这个"main"脚本调用的任何其他脚本都被指定为其__name__的文件名。因此,行if __name__ =="__main__" :是解释器的测试,用于确定它是在它所查看的脚本上运行(解析),还是临时查看另一个脚本。这使得程序员可以灵活地让脚本在外部调用时的行为有所不同。好的。

要了解发生了什么,首先要关注未插入的行以及它们在脚本中的显示顺序。记住,在调用函数或def块之前,它们本身不会做任何事情。如果译员喃喃自语,他会怎么想:好的。

  • 打开XYY PY。
  • 使用__name__ab.py导入并打开文件。
  • 哦,一个函数。我会记住的。
  • 好的,函数a();我刚刚学会了。我想我现在就打印。
  • 文件结束;回到'__main__'
  • 哦,一个函数。我会记住的。
  • 另一个。
  • 函数x();好,打印"s"。
  • 这是什么?一份if声明。好吧,条件已经满足了(变量__name__被设置为'__main__',所以我将打印‘b函数’。

不过,我认为你使用不当。可能有例外,但最下面的两行应该是:好的。

1
2
if __name__ =="__main__":
main()

…这意味着"如果这是‘主’脚本或主脚本,则执行名为main()的函数。这就是为什么您会看到一个def main():块在顶部,其中包含脚本功能的主要流程。好的。

Why we implement this?

Ok.

(哇,我在写这篇文章的时候,真的想到了这一点。这也是我很难理解的部分,因为我从来没有自己用从其他脚本调用的函数编写脚本。)好的。

还记得我之前说过的进口声明吗?当您导入一个模块时,它不仅"识别"它,而且等待进一步的指示。它实际上运行脚本中包含的所有可执行操作。因此,将脚本的肉放入main()函数可以有效地隔离它,将其隔离,这样当由另一个脚本导入时,它就不能立即运行。好的。

同样,也会有例外,但通常情况下,main()通常不会被外部调用。所以你可能还想知道一件事:如果我们不给main()打电话,为什么我们要给脚本打电话?这是因为许多人用独立的函数来构建自己的脚本,这些函数是为自己运行而构建的。然后在脚本的正文中的其他地方调用它们。这让我想到:好的。

Our code is work without it also

Ok.

是的,你是对的。这些单独的函数可以从不包含在main()函数中的内嵌脚本调用。如果你习惯于(像我一样,在编程的早期学习阶段)构建可以完全满足你需要的在线脚本,并且如果你再次需要这个操作,你会再次尝试去解决它-好吧,你不习惯这种代码内部结构,因为它的构建更复杂,而且它也没有那么直观阅读。但这是一个脚本,它可能不能让它的函数从外部调用,因为如果调用了,它将开始计算和分配变量。如果你试图重用一个函数,你的新脚本很可能与旧脚本有着密切的联系,可能会有冲突的变量。好的。

我应该说,作为旁白,这个线程包含了@kindall的答案,它最终帮助我理解了——为什么,而不是如何。不幸的是,它被标记为这个的副本,我认为这是一个错误。(我是这个板的新手,所以还不能标记它;如果你同意我,请标记它以引起国防部的进一步关注。)好的。好啊。


简单来说,只有当模块直接由python解释器(例如python module.py)执行或在导入后显式调用函数时,if __name__ =="__main__":中的所有内容才运行。

例子:测试文件

1
2
3
4
5
6
#this will always be executed even if this module is simply imported by other file or this module is the entry point
print"I will always run in any situation. Even when this module is 'just' imported"

if __name__ =="__main__":
    #this will be executed only when this module is the entry point eg. python testFile.py but not if this file is imported
    print"I will only run if this module (testFile.py) is executed directly by python interpreter"

App.Py

1
import testFile

python测试文件.py

输出:在任何情况下我都会跑步。即使这个模块是"刚刚"导入的

只有当这个模块(testfile.py)由python解释器直接执行时,我才会运行。

Python

输出:在任何情况下我都会跑步。即使这个模块是"刚刚"导入的

如果您想了解__name__变量的内部结构:检查这个,如果uu name_uuu=="uuu main_uuuuuuu":怎么办?