if __name__ =='__ main__'python

时间:2015-02-05 05:10:35

标签: python-3.1

我已经阅读了很多关于此事的文章

if __name__ == '__main__'

但没有得到它..我将分享你的代码,请你简单解释一下..

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

def a():
    print('A function in ab file');

a()

第二个文件是" xy.py"

import ab

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

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

x()

if __name__ == "__main__" :b()

当我执行此代码时,此输出即将到来

A function in ab file
s
b function

现在我想知道这是什么意思,实际上这个代码做了什么,为什么我们实现这个?我们的代码是没有它的工作

if __name__ == "__main__" :b()

4 个答案:

答案 0 :(得分:5)

你应该养成使用它的习惯。

在您明确运行文件时,将运行if __name__ == '__main__':之后的任何内容。

python myfile.py

但是,如果您在其他位置导入myfile.py

import myfile

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

答案 1 :(得分:3)

  

这段代码到底在做什么?

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

解释器使用__name__跟踪正在运行的脚本。当您运行脚本时 - 无论您将其命名为什么 - 解释器都会将其称为"__main__"。这就是它如何跟踪哪个脚本是主文件,即在外部调用另一个脚本后返回的脚本。 (你可能会说'主页'脚本。)从这个'main'脚本调用的任何其他脚本的文件名都被指定为__name__。因此,行if __name__ == "__main__" :是解释器的测试,用于确定它是否在正在查看的脚本(解析)上运行,或者它是否暂时窥视另一个脚本。这使程序员可以灵活地让脚本在外部调用时表现不同。

要了解正在发生的事情,请首先关注未缩进的行以及它们在脚本中出现的顺序。请记住,函数 - 或def - 块在调用之前不会自行执行任何操作。如果嘟to自己,翻译可能会想到什么:

  • 打开xy.py。
  • 使用__name__ ab.py。
  • 导入并打开文件
  • 哦,一个功能。我会记得的。
  • 好的,功能a();我刚学会了这个。我想我现在打印。
  • 文件结束;回到'__main__'
  • 哦,一个功能。我会记得的。
  • 另一个。
  • 功能x();好的,打印's'。
  • 这是什么?一个if声明。好吧,条件已经满足(变量__name__已设置为'__main__'),所以我将打印'b function'。

但我不认为你正确使用它。可能有例外,但最后两行应该是:

if __name__ == "__main__":
main()

...表示“如果这是'main'或主脚本,请执行名为main()的函数。这就是为什么你会看到一个def main():块顶部,其中包含主要脚本的功能流程。

  

为什么我们实施这个?

(哇,我实际上是在编写上面的内容时想出了这一部分。这也是我真正努力理解的部分,因为我从来没有自己编写过一个带有我从其他脚本调用的函数的脚本。)

还记得我之前说过的关于import语句的内容吗?导入模块时,它不仅仅“识别”它并等待进一步的指示。它实际上运行脚本中包含的所有可执行操作。因此,将脚本的内容放入main()函数可以有效隔离它,将其置于隔离状态,以便在由另一个脚本导入时无法立即运行。

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

  

我们的代码是没有它的工作

是的,你是对的。这些单独的函数可以从一个未包含在main()函数中的内联脚本调用。如果你已经习惯了(就像我在编程的早期学习阶段一样)来构建完全符合你需要的内联脚本,如果你再次需要这个操作,你会尝试再次弄清楚 - 好吧,你不习惯这种代码的内部结构,因为它的构建起来比较复杂,而且阅读起来也不那么直观。但这是一个可能无法在外部调用其函数的脚本,因为如果它确实会开始计算和分配变量。如果您正在尝试重新使用某个函数,那么您的新脚本可能与旧版本密切相关,可能存在冲突的变量。

我应该谨慎地说,this thread包含@kindall的答案,最终帮助我理解 - 为什么,而不是如何。不幸的是,它被标记为this one的副本,我认为这是一个错误。 (我是这个董事会的新手所以不能标记它;如果你同意我的意见,请将其标记为进一步的mod注意。)

答案 2 :(得分:2)

理解此声明的一个非常简单的示例如下:

假设我们有以下名为的 ' using_name.py'

# 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)直接运行脚本

$ python using_name.py

<强>结果

This program is being run by itself

2)导入脚本

$ python
import using_name

<强>结果

I am being imported from another module

答案 3 :(得分:0)

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

实施例: testFile.py

#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

import testFile

python testFile.py

<强>输出: 我会一直在任何情况下运行。即使这个模块只是&#39;只是&#39;进口

只有在python interpreter

直接执行此模块(testFile.py)时才会运行

python app.py

<强>输出: 我会一直在任何情况下运行。即使这个模块只是&#39;只是&#39;进口

如果您想了解__name__变量的内部结构: 请检查此What does if __name__ == "__main__": do?