__init__.py和__main__.py有什么区别?

buh*_*htz 27 python python-3.x

我知道这两个关于文件__init__.py和问题的问题__main__.py.

什么是__init__.py?

什么是__main__.py?

但我真的不明白它们之间的区别.

Ter*_*edy 40

包导入正在运行的python程序时运行__init__.py.例如,import idlelib在程序中,运行idlelib/__init__.py,它没有做任何事情,因为它的唯一目的是将idlelib目录标记为包.另一方面,tkinter/__init__.py包含大多数tkinter 代码并定义所有窗口小部件类.

当您将程序包作为主程序运行时,__ main__.py将作为"__main__" 运行.例如,python -m idlelib在命令行运行时idlelib/__main__.py,它开始空闲.同样,python -m tkinter运行tkinter/__main__.py,具有以下行:

from . import _test as main
Run Code Online (Sandbox Code Playgroud)

在这种情况下,.tkinter,所以进口.的进口tkinter,它运行tkinter/__init__.py. _test是该文件中定义的函数.因此调用main()(下一行)与python -m tkinter.__init__在命令行运行具有相同的效果.

  • 为什么`tkinter`在`__init__.py`文件中有很多代码而`idlelib`没有代码?有什么理由让您有时希望在 `__init__.py` 中包含代码,但有时却不想吗? (2认同)
  • `package/__init__.py` 中的代码使 `import package` 实际上做了一些事情。在 3.0 之前,`Tkinter` 是一个模块,而不是一个包。在 3.0 中,`Tkinter.py` 中的代码放在 `tkinter/__init__.py 中,因此唯一需要更改的是 `import tkinter` 而不是 `import Tkinter`。 (2认同)

小智 8

__init__.py,除其他外,将目录标记为 python 目录,并允许您在包范围级别设置变量。

__main__.py,除其他外,如果您尝试运行一组压缩的 python 文件,则会运行。 __main__.py允许您执行包。

这两个答案都是从您链接的答案中获得的。关于这些事情,你还有什么不明白的地方吗?