Skip to content

Python 脚本入口:if __name__ == "__main__"

很多脚本既想直接运行(例如 python myapp.py),又想被当作模块导入(例如 import myapp)。直接运行时通常要执行「启动逻辑」;被导入时一般不应自动跑这些逻辑(否则 import 时会产生副作用)。

Python 的惯例是:把「仅直接运行时才执行的代码」放在 if __name__ == "__main__": 块里,并在其中调用例如 main() 的入口函数。

__name__ 是什么?

每个模块都有一个模块级变量 __name__

  • 作为脚本直接执行时(如 python main_function.py),该文件被视为顶层入口,此时 __name__ 为字符串 "__main__"
  • 被其它文件 import 时,__name__ 一般为模块名(不含 .py,如 main_function)。

因此可以用下面判断区分两种用法:

python
if __name__ == "__main__":
    main()

示例:main_function.py

python
print("Start main_function.py")
print(f"__name__ 的值是 {__name__}")


def main():
    print("The main function")


if __name__ == "__main__":
    main()

直接运行:

bash
python main_function.py

输出:

text
Start main_function.py
__name__ 的值是 __main__
The main function

此时条件成立,main() 会执行。注意:文件顶部的 print导入时也会执行,因为它们不在 if 保护里。

作为模块导入:other_script.py

python
import main_function

print("Hello World")
bash
python other_script.py

输出(示意):

text
Start main_function.py
__name__ 的值是 main_function
Hello World

导入时 main_function 里的 __name__"main_function",不等于 "__main__",因此 main() 不会被调用。顶部的 print 仍会在 import 时执行一次——若不希望导入时有任何输出,应把可执行逻辑(含打印)尽量收进 main(),模块级只保留定义。

实践建议

  • 入口函数名习惯叫 main(),也可用其它名字,但 main 最直观。
  • CLI、测试、写文件等「脚本行为」 放在 main()if __name__ == "__main__": 内;函数、类、常量定义 放在模块级,便于复用与测试。
  • 需要解析参数时,可与 命令行参数 中的 argparse 等配合,在 main() 里调用。

小结

  • if __name__ == "__main__"::区分「直接运行」与「被 import」。
  • __name__ == "__main__" 仅对当前作为程序入口的那个文件成立;被导入的模块 __name__模块名

参考