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

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

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


当前回答

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

获取文件“ 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 的回答, 终于帮助我理解为什么, 而不是如何。 不幸的是, 它被标记为重复这个我认为这是一个错误。 )

其他回答

让我们更抽象地看待答案:

假设我们有这个密码x.py:

...
<Block A>
if __name__ == '__main__':
    <Block B>
...

区块 A 和 B 正在运行时运行x.py.

但是,在我们运行另一个模块时,只运行A区块(而不是B区块),y.py例如,x.py导入并运行代码(例如当函数在x.py调自y.py).

if __name__ == "__main__"是在脚本从命令行运行时运行的部分,使用类似命令python myscript.py.

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

下代码的代码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 中做.

如果此. py 文件由其它. py 文件导入, 代码在if将不执行语句。

如果此. py 运行由python this_py.py在 shell 下方的代码,或在 Windows 中双击。if将执行语句。

通常写作用于测试。