导入Python模块后echo未出现在sys.modules中的问题排查
为什么
from game.sound.echo import *后'echo' not in sys.modules? 这问题我当初刚折腾Python包结构的时候也踩过一模一样的坑!核心原因其实是**sys.modules里存储的是模块的完全限定名称(也就是完整的导入路径),而不是你在导入时用的短模块名**。
咱们一步步拆解:
- 首先,
sys.modules的键是模块的完整导入路径字符串,比如你这个场景里,game.sound.echo模块被加载后,会以'game.sound.echo'作为键存在sys.modules里,而不是'echo'。你可以试试执行print('game.sound.echo' in sys.modules),肯定会返回True。 - 然后看
from game.sound.echo import *的行为:这条语句确实会加载game.sound.echo模块到内存中(所以它会出现在sys.modules里),但它的作用是把模块内的所有公开名称(不以下划线开头的)导入到当前命名空间里,而不是把模块本身以echo这个短名称注册到sys.modules或者当前命名空间(除非你显式写import game.sound.echo as echo)。 - 至于
'sys' in sys.modules返回True,那是因为sys是Python的内置核心模块,Python解释器启动的时候就自动加载了,和你这次导入包的操作完全无关。
举个实际验证的例子,你可以在导入后执行这两行代码:
import sys print('game.sound.echo' in sys.modules) # 输出 True print('echo' in sys.modules) # 输出 False
这样就能直观看到差异啦!
内容的提问来源于stack exchange,提问作者sk Jin
相关产品推荐
相关产品推荐

