为什么Python在我只运行一次的情况下,使用exec()函数时却运行了文件两次?

1 投票
1 回答
74 浏览
提问于 2025-04-14 16:49

我正在尝试创建一个模组加载程序,我尝试的方法之一是使用我发现的 exec() 函数。我查看了Stack Overflow 上的这个问题来解决我的问题,但那个问题的答案是不要把模块导入到自己里面(据我所知,我并没有这样做)。

代码

预期输出

['example']
Hello World!

我看到的

['example']
Hello World!
['example']
Hello World!

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'")

'''
for fileIndex in range(len(files)):
    importFileName = ""
    fileName = files[fileIndex]

    for char in fileName:
        if not char == ".":
            importFileName += char
        else:
            break

    if not fileName in ignoredFiles:
        mods.append(importFileName)
'''

exec(open("Welder/mods/example.py").read())

mods = list(set(mods))  # Removes weirdly added duplicates
print(mods)

printHello()

example.py

from main import mods

def printHello():
    print("Hello World!")

mods.append("example")

1 个回答

1

你看到输出出现了两次,是因为Python解释器把main.py文件打开并运行了两次;

  • 第一次是当你运行 python main.py 的时候
  • 第二次是当example.py通过 from main import mods 导入main.py的时候

每次解释main.py的时候,printHello() 函数都会被调用。

为了防止第二次调用,你可以把main.py最后的四行代码替换成:

if __name__ == "__main__":
    exec(open("Welder/mods/example.py").read())

    mods = list(set(mods))  # Removes weirdly added duplicates
    print(mods)

    printHello()

撰写回答