为什么Python导入模块时,模块顶层print会早于import后的代码输出?
Python模块导入输出顺序问题解答
核心原因
该输出顺序是Python的模块导入机制的正常表现,遵循两个基础规则:
- 执行
import 模块名语句时,Python会先完整执行被导入模块的所有顶层代码(即不在函数、类等嵌套代码块中的可执行语句),模块加载完成后才会继续执行当前文件import语句后的代码 - 模块的
__name__属性随运行场景变化:作为入口直接运行时__name__值为__main__,被其他文件导入时__name__值为模块自身的名称
完整执行流程
对应代码运行two.py时的执行顺序如下:
- 运行two.py作为程序入口,从上到下执行代码,首先命中第一行
import one,启动one模块的加载流程 - 逐行执行one.py的顶层代码:
- 先完成
func函数的定义,该步骤无输出 - 执行顶层
print("top level one.py"),输出对应内容 - 判断
if __name__ == '__main__':one此时是被导入的模块,__name__值为one不满足条件,执行else分支的print("one.py has been imported"),输出对应内容
- 先完成
- one模块加载完成,回到two.py继续执行后续代码:
- 执行
print("top level two.py"),输出对应内容 - 调用
one.func(),输出函数内的func in one.py - 最后判断two.py的
__name__,因为是直接运行,所以输出two.py being run directly
- 执行
代码参考
two.py
import one print("top level two.py") one.func() if __name__ == '__main__': print("two.py being run directly") else: print("two is being imported")
one.py
def func(): print("func in one.py") print("top level one.py") if __name__ == '__main__': print("one.py is being run directly") else: print("one.py has been imported")
内容的提问来源于stack exchange,提问作者JelloSquirrel
相关产品推荐
相关产品推荐

