Python模块导入疑问:为何import sub无法访问子模块load_me?
问题解答
这是Python的预期行为,你的项目结构没有错误。
原因说明
当执行import sub时,Python只会加载sub包根目录下的__init__.py文件,并不会自动导入包内的子模块(比如load_me.py)。此时sub这个命名空间里只有__init__.py中定义的内容,自然没有load_me这个属性,所以调用sub.load_me.run_me()会抛出AttributeError。
而from sub import load_me是明确指定要导入sub包下的load_me子模块,Python会加载该模块,并将其绑定到当前命名空间(同时也会把load_me作为属性添加到sub包的命名空间中),因此可以正常调用load_me.run_me()。
解决方法
如果想通过import sub后直接访问sub.load_me,可以在sub/__init__.py中添加显式导入语句:
# sub/__init__.py from . import load_me
这样当你import sub时,load_me模块会被自动加载,就能正常使用sub.load_me.run_me()了。
另外,也可以直接导入子模块:
import sub.load_me sub.load_me.run_me() # 或者用别名简化 import sub.load_me as lm lm.run_me()
内容的提问来源于stack exchange,提问作者benjamin-lgba
相关产品推荐
相关产品推荐

