文章目录
- 1. __init__.py
- 作用:
- 用法:
- 示例:
- 特点
- 2. __main__.py
- 作用:
- 用法:
- 示例:
- 特点:
- 3. 综合示例
- 总结:
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__.py
和 main.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
运行效果:
- 直接运行包:如果在命令行中运行 python -m my_package,Python 会执行
my_package/__main__.py
文件中的 main() 函数,输出:
Hello from module1!
Goodbye from module2!
- 导入包:如果在 main.py 中执行
import my_package
,则会触发my_package/__init__.py
中的导入逻辑,但不会自动执行__main__.py
。
总结:
__init__.py
:用于标识目录为包,并进行包级别的初始化。可以包含初始化逻辑,导入子模块等。
__main__.py
:用于定义包的入口点,使得包可以作为脚本运行(通过 python -m package_name 命令)。
这两者结合使用,可以使得 Python 项目在作为模块使用时更具灵活性,同时能够方便地作为独立的脚本运行。