Python 3.6 IDLE中二次执行import circle命令未达预期输出
解决Python模块重复导入无输出的问题
这是Python模块导入机制的正常行为,别担心,我来给你解释清楚并提供解决方案!
问题原因
Python为了优化性能,会对导入过的模块进行缓存:当你第一次执行import circle时,Python会执行模块里的所有代码,然后把模块对象存储在sys.modules字典中。之后再导入同一个模块,Python不会重新执行模块代码,只会直接返回缓存里的模块对象,所以第二次导入就看不到输出了。
解决方案
方案1:使用importlib.reload()重新加载模块
这是最直接的方式,专门用来重新加载已经导入过的模块,强制执行模块内的代码:
# 先导入importlib模块 import importlib # 第一次导入,正常输出 import circle # 重新加载模块,再次输出内容 importlib.reload(circle)
每次调用reload(circle)都会重新执行circle.py里的代码,就能看到输出了。
方案2:把代码封装成函数(推荐)
更规范的做法是把模块里的打印逻辑封装成函数,这样不管导入多少次,只要调用函数就能输出内容,同时还能避免模块导入时自动执行代码的副作用:
修改circle.py的代码:
PI = 3.14159 r = 7 def print_circle_details(): print('Circumference of the circle: ', 2 * PI * r) print('Area of the circle: ', PI * r * r) # 只有直接运行该模块时才自动执行函数,导入时不执行 if __name__ == '__main__': print_circle_details()
然后在IDLE里使用:
import circle # 第一次调用函数,输出内容 circle.print_circle_details() # 再次调用,依然会输出 circle.print_circle_details()
方案3:删除模块缓存后重新导入(不推荐)
你也可以手动从sys.modules中删除缓存的模块,然后重新导入,但这种方式可能会引发一些意外问题(比如模块内的全局状态被重置),所以只建议测试时临时使用:
import sys # 第一次导入,输出内容 import circle # 删除缓存的模块 del sys.modules['circle'] # 再次导入,重新执行代码并输出 import circle
内容的提问来源于stack exchange,提问作者saurabh maggo
相关产品推荐
相关产品推荐

