You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:53:28