【Python】__main__.py、__init__.py

发布于:2025-02-10 ⋅ 阅读:(127) ⋅ 点赞:(0)

1. init.py

作用:

  • __init__.py 文件的主要作用是标识一个目录是一个 Python 包,并且可以在包初始化时执行一些代码。它使得该目录下的模块可以被导入到其他模块中。

  • 如果一个目录包含 __init__.py 文件,则该目录被视为一个 Python 包。没有 __init__.py 文件的目录会被视为普通文件夹,无法作为包被导入。

  • __init__.py 文件通常用于包的初始化,可以包含导入语句、初始化设置、配置项、或者定义一些包级别的常量

用法:

  • 在包目录下创建一个 __init__.py 文件,文件可以是空的,也可以包含一些初始化代码。
    -__init__.py文件可以包含一些初始化操作,例如导入子模块、函数、类等。

示例:

假设有以下项目结构:

my_project/
    ├── my_package/
    │   ├── __init__.py
    │   ├── module1.py
    │   └── module2.py
    └── main.py

__init__.py 可以是空的,也可以包含一些初始化代码。例如:

# my_package/__init__.py
print("Initializing my_package...")

from .module1 import function1
from .module2 import function2

main.py 中,我们可以导入 my_package 中的函数:

# main.py
import my_package

my_package.function1()
my_package.function2()

在这种情况下,my_package/__init__.py 会在导入时执行,打印 “Initializing my_package...”。

特点

可以包含包的初始化逻辑。
导入包时,__init__.py 会自动执行。
如果 __init__.py 文件是空的,目录依然会被识别为包,但不会执行任何代码。

2. main.py

作用:

  • __main__.py 文件在包作为脚本运行时起作用。它定义了包的“入口点”,使得我们能够直接运行一个包目录,而不是单独运行包中的某个模块。

  • 当你在命令行中执行 python -m package_name 时,Python 会尝试运行该包中的 __main__.py 文件。

  • __main__.py 文件通常用于包的主要功能或者入口点,类似于一个包的 “main” 函数。

用法:

  • __main__.py 仅在包作为主程序运行时起作用。它通常是一个包含主要程序逻辑的文件。
  • 当使用 python -m package_name 命令执行包时,__main__.py 会被执行。

示例:

假设我们有如下项目结构:

my_project/
    ├── my_package/
    │   ├── __init__.py
    │   ├── __main__.py
    │   ├── module1.py
    │   └── module2.py
    └── main.py
__main__.py 中定义了包的入口逻辑:
# my_package/__main__.py
print("Welcome to my_package!")

然后,你可以在命令行中使用 -m 参数来运行包:

python -m my_package

当运行上面的命令时,Python 会查找 my_package 包中的__main__.py文件并执行它,输出:

Welcome to my_package!

特点:

用于定义包的“入口点”,使得包可以直接运行。
当包作为模块运行时,main.py 会被执行。
如果包目录没有 main.py 文件,那么运行 python -m package_name 会抛出 ModuleNotFoundError 错误。

3. 综合示例

以下是一个更复杂的示例,展示了 __init__.pymain.py 如何协作:

假设项目结构如下:

my_project/
    ├── my_package/
    │   ├── __init__.py
    │   ├── __main__.py
    │   ├── module1.py
    │   └── module2.py
    └── main.py
  • module1.py:
# my_package/module1.py
def greet():
    print("Hello from module1!")
  • module2.py:
# my_package/module2.py
def goodbye():
    print("Goodbye from module2!")

  • __init__.py
# my_package/__init__.py
from .module1 import greet
from .module2 import goodbye

  • main.py:
# my_package/__main__.py
from . import greet, goodbye

def main():
    greet()
    goodbye()

if __name__ == "__main__":
    main()

  • main.py:
# main.py
import my_package

运行效果:

  1. 直接运行包:如果在命令行中运行 python -m my_package,Python 会执行 my_package/__main__.py 文件中的 main() 函数,输出:
Hello from module1!
Goodbye from module2!
  1. 导入包:如果在 main.py 中执行 import my_package,则会触发 my_package/__init__.py 中的导入逻辑,但不会自动执行 __main__.py

总结:

__init__.py:用于标识目录为包,并进行包级别的初始化。可以包含初始化逻辑,导入子模块等。
__main__.py:用于定义包的入口点,使得包可以作为脚本运行(通过 python -m package_name 命令)。
这两者结合使用,可以使得 Python 项目在作为模块使用时更具灵活性,同时能够方便地作为独立的脚本运行。


网站公告

今日签到

点亮在社区的每一天
去签到