为什么Python在我只运行一次的情况下,使用exec()函数时却运行了文件两次?
我正在尝试创建一个模组加载程序,我尝试的方法之一是使用我发现的 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()