Python 是否有 main 函数?
结论
Python 没有强制的 main 函数,但有一个约定俗成的惯用写法来实现相同效果。
__name__ 与 __main__
每个 Python 文件都有一个内置变量 __name__:
- 直接运行该文件时:
__name__ == "__main__" - 被其他模块导入时:
__name__ == "模块名"
# demo.py
print(__name__)
$ python demo.py # 输出: __main__
$ python -c "import demo" # 输出: demo
标准惯用写法
# app.py
def greet(name):
print(f"Hello, {name}!")
def main():
greet("Alice")
if __name__ == "__main__":
main()
if __name__ == "__main__": 这个守卫(guard)确保:
- 直接运行
python app.py时,main()会被调用 - 被其他文件导入
import app时,main()不会自动执行
为什么需要这个守卫?
# utils.py
def add(a, b):
return a + b
print(add(1, 2)) # ❌ 没有守卫,导入时会直接执行打印
# main.py
import utils # 导入时意外打印了 "3"
加上守卫后:
# utils.py
def add(a, b):
return a + b
if __name__ == "__main__":
print(add(1, 2)) # ✅ 只在直接运行时执行
对比其他语言
| 语言 | 入口点 |
|---|---|
| C / C++ | int main() 强制存在 |
| Java | public static void main(String[] args) 强制存在 |
| Go | func main() 强制存在 |
| Python | 无强制入口,用 if __name__ == "__main__": 约定 |
Python 脚本从文件顶部开始顺序执行,不需要特定的入口函数。
模块层级的 __main__.py
对于包(package),可以创建 __main__.py 文件,使包可以直接用 python -m 运行:
mypackage/
├── __init__.py
├── __main__.py ← 包的入口
└── core.py
# __main__.py
from .core import run
if __name__ == "__main__":
run()
$ python -m mypackage # 自动执行 __main__.py
许多标准库模块都支持此方式,如:
$ python -m http.server 8080 # 启动 HTTP 服务器
$ python -m json.tool data.json # 格式化 JSON
$ python -m pytest # 运行测试
总结
- Python 没有强制的
main函数,脚本从顶部顺序执行 __name__ == "__main__"是判断文件是否被直接运行的标准方式if __name__ == "__main__": main()是 Python 约定的入口写法,应养成习惯- 包级别可用
__main__.py配合python -m实现模块化入口