Python脚本中的__main__中的作用

Python脚本中的__main__中的作用

Python 中,if __name__ == "__main__": 是一个常见的结构,主要用于控制代码的执行方式,确保代码只有在直接运行当前文件时才会执行,而不会在被其他模块导入时执行。

什么是 __name__?

📌 在 Python 中,每个模块(文件)在运行时都会有一个特殊的变量 __name__,它的值取决于模块是直接执行还是被导入。

✅当 Python 直接运行文件时,__name__ 的值是 "__main__"

✅当 Python 文件被作为模块导入时,__name__ 取的是文件的模块名(不带 .py)。

🔹 示例:检查 __name__ 的值

1
2
3
# my_module.py
print(f"当前模块的 __name__ 变量值是: {__name__}")

如果直接运行 my_module.py

1
python my_module.py

输出:

1
当前模块的 __name__ 变量值是: __main__

如果这个文件被其他 Python 文件 import

1
2
3
# another_script.py
import my_module

输出:

1
当前模块的 __name__ 变量值是: my_module

为什么要用 if __name__ == "__main__":

📌 在 Python 中,我们通常使用 if __name__ == "__main__": 来避免导入时执行不必要的代码。

🔹 示例:没有 if __name__ == "__main__" 的问题

1
2
3
4
5
6
7
8
# my_script.py
print("这个文件被运行了!")

def greet():
print("Hello, World!")

greet()

如果直接运行:

1
python my_script.py

输出:

1
2
这个文件被运行了!
Hello, World!

但如果被 import

1
import my_script  # 这里仅仅是导入

仍然会输出:

1
2
这个文件被运行了!
Hello, World!

⚠️ 问题:

⛔️意外执行:我们只是想导入 greet() 函数,但文件里的所有代码都被执行了!

⛔️可能导致错误:如果 my_script.py 里包含数据库操作或 IO 操作,会被意外触发。

正确使用 if __name__ == "__main__":

🔹 继续上个例子,添加 if __name__ == "__main__":

1
2
3
4
5
6
7
8
9
10
# my_script.py
print("这个文件被运行了!") # 这个仍然会在导入时执行

def greet():
print("Hello, World!")

# 只有直接运行时才会执行
if __name__ == "__main__":
greet()

✅ 改进后

1
import my_script  # 仅仅导入,不会执行 greet()

输出(没有不必要的执行):

1
这个文件被运行了!

greet() 不会执行,除非显式调用 my_script.greet()

企业实战案例

📌 在实际项目中,if __name__ == "__main__": 主要用于:

✅ 编写可复用的模块

✅ 防止导入时的副作用

✅ 让 Python 脚本既能独立运行,又能作为模块使用

🔹 案例 1:数据库初始化

1
2
3
4
5
6
7
8
9
10
11
12
# database.py
import sqlite3

def init_db():
conn = sqlite3.connect("example.db")
print("数据库初始化完成!")
conn.close()

# 只有在直接运行 database.py 时才会初始化数据库
if __name__ == "__main__":
init_db()

🟢 好处:

🟢 其他模块可以 import database 而不会初始化数据库。

🟢 只有直接运行 python database.py 时才会初始化数据库。

🔹 案例 2:命令行工具

1
2
3
4
5
6
7
8
9
10
11
12
# cli_tool.py
import sys

def main():
if len(sys.argv) > 1:
print(f"你输入的参数是:{sys.argv[1]}")
else:
print("请提供参数!")

if __name__ == "__main__":
main()

直接运行:

1
python cli_tool.py hello

输出:

1
你输入的参数是:hello

⚠️ 导入时不会自动运行 main()

🔹 案例 3:Web 服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
# app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
return "Hello, Flask!"

# 仅当直接运行时才启动 Flask 服务器
if __name__ == "__main__":
app.run(debug=True)

✔️ 这样就不会在 import app 时启动 Flask 服务器!

if __name__ == "__main__": VS __main__.py

📌 有时,我们也可以使用 __main__.py 作为项目入口。

🔹 示例:Python 包执行

1
python -m my_package

🔴 如果 my_package/__main__.py 存在,它就会执行,效果类似 if __name__ == "__main__":。

总结

场景 if __name__ == "__main__": 的作用
直接运行 Python 文件 代码会执行
Python 文件被导入 代码不会执行
适用于脚本工具 让 Python 文件既可独立运行,又可导入
适用于 Flask、Django 避免 import 时启动服务器
适用于数据库操作 避免 import 时创建连接

✅ 建议始终使用 if __name__ == "__main__":,以确保 Python 文件可复用且无副作用。🚀


Python脚本中的__main__中的作用
https://dreamshao.github.io/2025/03/28/python脚本中的main方法/
作者
Yun Shao
发布于
2025年3月28日
许可协议