为何使用exec()仅执行一次文件,Python却运行两次?
问题分析与解决
问题原因
你的重复输出是因为模组导入主模块时触发了主脚本的二次执行:
- 直接运行
main.py时,代码会执行到exec(open("Welder/mods/example.py").read()),加载并运行example.py example.py里的from main import mods会让Python把main.py当作模块导入,此时main.py的所有代码会被重新执行一遍——包括exec加载模组、print(mods)和printHello(),最终导致两次输出。
解决方案
1. 主脚本执行逻辑隔离
把主脚本的核心执行代码放到if __name__ == "__main__":块中,这样当main.py被作为模块导入时,这部分代码不会重复执行。
2. 避免模组导入主模块
通过exec的globals参数,直接将mods传递给模组环境,让模组无需导入主模块就能访问该变量。
修改后的代码
main.py
import os import types MODSDIR = 'Welder/mods/' mods = [] ignoredFiles = ["__init__.py", "__pycache__"] files = os.listdir(MODSDIR) def register(mod): try: mods.append(mod) except: print("Welder.error.ERROR: mod ID must be type 'str'") # 把执行逻辑放到__main__块中 if __name__ == "__main__": # 执行模组时传入当前全局变量,让模组可以直接访问mods exec(open("Welder/mods/example.py").read(), globals()) mods = list(set(mods)) # 去重 print(mods) printHello()
example.py
# 去掉from main import mods,直接使用globals传递过来的mods def printHello(): print("Hello World!") mods.append("example")
验证结果
修改后运行main.py,输出将符合预期:
['example'] Hello World!
内容的提问来源于stack exchange,提问作者Tiimzee
相关产品推荐
相关产品推荐

