跳到主要内容

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() 强制存在
Javapublic static void main(String[] args) 强制存在
Gofunc 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 实现模块化入口