Python如何实现仅在模块导入或重载时打印指定内容
解决模块导入/重载时仅打印一次版本信息的方案
Python模块的顶层代码默认仅会在首次导入时执行一次,重复调用import不会重新触发顶层代码运行。你遇到的执行类方法时重复打印的问题,一般是代码中存在显式importlib.reload()调用、使用了带热重载的开发工具(如Flask调试模式、Jupyter的autoreload扩展),导致模块被反复加载触发顶层代码执行。
你可以通过给模块加自定义标记属性的方式控制打印逻辑,适配所有Python3版本,修改后的代码如下:
import sys import numpy as np # 仅在模块首次导入/重载时打印版本信息 if not hasattr(sys.modules[__name__], '_version_printed'): print('This is the script version 1.0') setattr(sys.modules[__name__], '_version_printed', True) def func1(): # 你的原有逻辑 pass def func2(): pass class Open: def __init__(self, others): pass def func3(self): pass def func4(): pass def func5(): pass
原理解释
sys.modules[__name__]可以获取当前模块的实例对象- 首次导入模块时,模块实例没有
_version_printed属性,会执行打印并给模块添加该属性 - 后续反复导入模块、调用模块内的函数/类方法时,模块实例的
_version_printed属性已经存在,不会重复执行打印 - 如果显式重载模块(调用
importlib.reload()),原有模块实例会被销毁重建,属性丢失,会再次打印版本信息,刚好匹配你要求的重载时打印的需求
如果需要同时支持直接运行脚本时也打印版本信息,可以把判断条件修改为:
if __name__ == '__main__' or not hasattr(sys.modules[__name__], '_version_printed'): print('This is the script version 1.0') setattr(sys.modules[__name__], '_version_printed', True)
内容的提问来源于stack exchange,提问作者user3177899
相关产品推荐
相关产品推荐

