我不理解python的主块。那是什么东西?

I don't understand Python's main block. What is that thing?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does do?

所以我启动了pyscripter,得到了一个文件,其中包含:

1
2
3
4
5
def main():
    pass

if __name__ == '__main__':
    main()

那是什么?为什么没有它我的程序也能工作?这样做的目的是什么?我的代码会去哪里?让我们说一个打印hello world的函数。那会去哪里?我在哪里打电话?


其目的基本上是,您可以定义一个中心入口点,如果并且仅当脚本直接运行时。因为只有靠自己运行,__name__才会等于'__main__'。将脚本的实际内容放入一个单独的函数中可以让其他脚本导入所述函数并在需要时运行它,因此在导入脚本时不会立即运行它。

这在libary模块中也经常被用来在您快速需要某些东西时具有一些默认行为。例如,http.server模块提供了一个广泛的功能,可以用您能想到的任何功能创建您自己的HTTP服务器。如果您只想快速让一个简单的服务器静态地监听和传递文件,那么在从命令行运行时,您可以使用模块的默认行为。

在命令行上运行python3 -m http.server将完全做到这一点;运行http.server模块,该模块本身将在其__name__ == '__main__块中启动一个简单的HTTP服务器。

回应您的评论:

对于作为库、包含类型或函数的普通模块,您的应用程序需要的是,您不需要main函数或主块。对于直接调用的脚本,例如实际启动应用程序的启动脚本,您将拥有一些未封装在函数或类中但直接运行的代码。这是个问题,您可以放入一个主函数,然后分别调用它。这会让您有更多的自由去放置代码。例如,您可以在文件的开头直接使用main函数,而在该函数中调用的其他函数将进一步定义到文件中。脚本的最后一部分就是main()。你不需要把它放到if __main__ == '__main__':的条件下,你可以直接调用它。例如,您的脚本可能如下所示:

1
2
3
4
5
6
7
8
9
10
11
def main ():
    # doing something
    utilityFunction(...)
    otherUtilityFunction(...)

def utilityFunction (...):
    ...
def otherUtilityFunction (...):
    ...

main()

如果不将代码放入单独的函数中,则必须在底部(在函数定义之后)执行所有处理,如果只想在直接调用脚本时快速查看所做的操作,则可能会适得其反。

现在,正如我所说的,您不需要将其放入主条件块;您可以直接调用它。但是,如果出于任何原因需要包含该文件,例如,因为您想将其封装到其他东西中,或者如果您想从交互shell(idle或其他东西)中反复调用该文件,那么您可能不想在只导入模块时运行main(),但仅当您想实际执行该模块时才运行main()。TS功能。这就是您应该将main()放入条件的地方;这样,除非您直接执行模块,否则它不会被执行。

总的来说,把main()调用放在这样的条件下并不是一个坏主意,因为它永远不会受到伤害,但在以后的某个时候会变得有用。


执行python文件时,__name__global设置为__main__,当您导入文件时,它被设置为其名称。

该构造只允许在执行文件时执行一些代码。例如,如果您有文件mymain.py

1
2
3
4
5
6
def main():
    print('Hello, World!')


if __name__ == '__main__':
    main()

您将获得以下结果:

1
2
3
4
5
6
7
8
9
$ python mymain.py
Hello, World!
$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type"help","copyright","credits" or"license" for more information.
>>> import mymain    # main() *not* executed
>>> mymain.main()
Hello, World!

在没有执行代码的情况下导入文件通常很有用。这样,第三方软件就可以调用主函数,而无需创建新的进程,并允许它们在运行前更改某些内容。

所以,这是不必要的,但它是一个很好的实践使用。通常,您会意识到程序的某些函数/类可能对其他程序有用,因此能够在不执行主程序的情况下导入文件是很好的做法。

与具有EDCOX1,3的块的Java相比,它具有一个只有EDCOX1×4的方法的类,并且使用其他类来完成他的工作,而不使用它就像在一个类中也有一个EDCOX1×4的方法,它也提供了其他的功能(例如某种容器或任何一个执行EMA OCX1 4)的方法来执行MA。在程序中)。


python中的所有内容都是语句,没有声明(例如,def是一个创建函数对象并将其绑定到名称的语句)。导入模块意味着(在一些簿记之后)执行模块中的语句。同样,执行python文件意味着将其作为模块导入。因此,只需在模块级语句工作时编写程序。

当然,这是不可重用的。当"程序"对于其他模块也应该是可导入的时,您将它放入一个函数中(还有一些其他的小优点)。但是,执行该文件(python file.py除了定义该函数外,什么也不做。

输入__name__,这是模块名,等于"入口点"模块的'__main__'。因此,条件检查模块是作为脚本导入还是运行,并在后一种情况下执行其工作。


这个想法非常简单:您可以将该文件用作包(要导入到某个地方的东西)或纯脚本。如果该文件用作脚本,则python的解释器变量"__name__包含"__main__而不是包的名称。

因此,我们在这里测试是否将__name__设置为__main__,这意味着我们处于脚本模式,如果是,我们将在"if"块中执行代码。

您必须理解Java和Python之间的主要区别:在Python中,当解释器读取文件时,它被执行——>声明和代码都被解释,Python的许多特性都是基于此的。


你实际上不需要这个技巧来"你好世界",但它在你写模块的时候很有用。只有直接执行脚本时,if __name__ == '__main__'子句才会使其运行main(),如果用作从其他脚本导入,则不会运行。