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

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

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


当前回答

创建文件,a.py , a.py , a.py , a.py , a.py , a.py , a.py , a.py:

print(__name__) # It will print out __main__

__name__始终等于__main__当该文件为直接直接运行显示此为主文件 。

创建另一个文件,b.py b.py,在同一目录中:

import a  # Prints a

运行它,它会打印a,即哪个文件的名称已导入.

所以,为了展示同一文件的两种不同行为,这是一个常用的把戏:

# Code to be run when imported into another python file

if __name__ == '__main__':
    # Code to be run only when run directly

其他回答

创建以下两个文件 :

# a.py

import b
# b.py

print("__name__ equals " + __name__)

if __name__ == '__main__':
    print("if-statement was executed")

现在每个文件都单独运行 。


运行中python a.py:

$ python a.py
__name__ equals b

何时a.py执行时,它导入模块b。这导致所有代码都在里面b要运行。 Python 设置globals()['__name__']和在b模块的模块到模块名称,b.


运行中python b.py:

$ python b.py
__name__ equals __main__
if-statement was executed

仅在文件b.py已执行, Python 设置globals()['__name__']在此文件中的文件中"__main__"因此,if用于True这一次。

if __name__ == "__main__":基本上是顶层的脚本环境, 它指定了翻译( “ 我最优先首先执行 ” ) 。

'__main__'是顶层代码执行范围的名称。模块的__name__设置为等于'__main__'从标准输入、脚本或交互式提示读取。

if __name__ == "__main__":
    # Execute only if run as a script
    main()

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将不执行。

有关代码的机理有很多不同之处, “如何” 但对我而言,除非我理解“为什么” , 否则这些都说不通。 这应该对新的程序员有特别的帮助。

获取文件“ ab. py ” :

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

第二个文件“xy.py”:

import ab
def main():
    print('main function: this is where the action is')
def x():
    print ('peripheral task: might be useful in other projects')
x()
if __name__ == "__main__":
    main()

这个代码到底在干嘛?

执行时执行xy.py, 您 , 您import ab。导入语句在导入时立即运行模块,因此ab业务在剩余时间之前完成xy完成后ab,它继续xy.

口译员跟踪脚本运行的脚本__name__。当您运行一个脚本时,不管你叫什么,口译员都叫它"__main__",使它成为在运行外部脚本后返回的主人或“家”脚本。

任何其它的脚本 从这里调用"__main__"将其文件名指定为脚本__name__(例如,__name__ == "ab.py"因此,线线if __name__ == "__main__":是口译员的测试, 以确定它是否在解释/ 区分最初执行的“ 家” 脚本, 或者它是否临时偷看另一个( 外部) 脚本。 这让程序员具有灵活性, 如果直接执行的话, 脚本行为会有所不同 。

让我们跨过上面的代码 来理解发生了什么, 首先关注未缩入的行和它们出现在脚本中的顺序。 记住这个函数 - 或者def翻译会说,如果自己自欺欺人的话:

  • 打开 xy.py 作为“ home” 文件; 调用它"__main__"和在__name__变量。
  • 导入并打开文件__name__ == "ab.py".
  • 哦,一个功能,我会记住的
  • Ok, 函数函数a(); 我刚学到了这一点。打印ab 文件中的函数'.
  • 文件结束; 返回到"__main__"!
  • 哦,一个功能,我会记住的
  • 再来一个
  • 函数职能职能职能职能职能职能职能职能x(); OK, 打印 '外围任务:在其他项目中可能有用'.
  • 这是什么?if条件已经满足(变量__name__设定为"__main__"),所以我将进入main()函数和打印main 函数:这是动作所在位置'.

底下两行的意思是: "如果这是"__main__"或“ home” 脚本, 执行调用的函数main()这就是为什么你会看到def main():上方块块, 包含脚本功能的主流 。

为什么要执行这一规定?

还记得我之前说过的进口对帐单吗 ? 当您导入一个模块时, 它不只是“ 承认” 它, 等待进一步的指示 - 它实际上运行脚本中包含的所有可执行操作 。 所以, 将您的脚本中的肉输入到脚本中 。main()功能有效隔离它, 将其隔离, 这样它不会在被其它脚本导入时立即运行 。

同样,也有例外,但通常的做法是:main()通常不会在外部被调用。所以你可能想知道一件事: 如果我们不打电话,main(), 为什么我们要调用剧本? 这是因为许多人用独立的功能构建剧本结构, 这些功能是用来独立运行的, 独立于文件的其余代码。 他们后来在剧本的正文中被调用到别的地方。 这让我想到:

但是没有它 代码是有效的

是的,没错,这些独立的功能能够被调自一个内线脚本, 它不包含在main()函数。如果您习惯(像我一样,在编程的早期学习阶段) 建立内部脚本, 来做你需要的, 你会试着再弄清楚, 如果你需要操作的话... 好吧, 你对代码的这种内部结构并不习惯, 因为它更复杂, 并且没有直观的阅读能力。

但是,这个剧本可能无法将其功能外部命名, 因为如果它真的存在的话, 它会立即开始计算和分配变量。如果你试图重新使用一个函数, 你的新剧本就会与旧剧本紧密相连, 而旧剧本会互相冲突。

分离独立函数时, 您可以通过将您先前的作品调用为另一个脚本来重新使用您之前的工作 。 例如, “ example. py” 可能会导入“ Xy. py” 并调用x(),使用“xy.py”中的“x”函数(也许它正在将给定文本字符串的第三个字数化为资本化;从数字列表中创建 NumPy 阵列并进行排列;或解开3D表面。可能性是无限的。)

(以物配主者,问题 本问题@ kindall 的回答, 终于帮助我理解为什么, 而不是如何。 不幸的是, 它被标记为重复这个我认为这是一个错误。 )

当我们的模块中有某些语句时(M.py)我们想要当它作为主(而非导入)运行时被执行, 我们可以将这些语句( 测试案例、 打印语句) 置于此下if区块。

默认值( 当模块作为主模式运行时, 不导入)__name__变量设置为"__main__",当它将进口__name__变量将获得不同的值, 最有可能是模块的名称('M'这有助于将模块的不同变量合并运行,并区分其具体的输入和输出语句,以及如果有任何测试案例的话。

简简,使用此“if __name__ == "main"防止模块导入时运行(确定)代码的块。