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__为模块名。