为何Python子模块__init__.py无法向foo.py传递HELLO变量?
解决Python包中__init__.py变量无法传递给子模块的问题
我懂你的困惑——刚接触Python包结构时,很多人都会误以为__init__.py里的变量会自动被同包内的其他模块共享,但其实Python的每个.py文件都是独立的模块,哪怕它们在同一个包目录下,子模块也不会自动继承__init__.py里的变量。
问题根源
你的foo.py里直接使用HELLO,但这个变量只定义在module/__init__.py中,foo.py并没有主动导入它,所以Python解释器找不到这个名称,就抛出了NameError。
修复方案
有几种简单的方式可以解决这个问题:
方案1:在foo.py中用相对导入获取变量
修改foo.py的代码,从当前包的__init__.py导入HELLO:
from . import HELLO def bar(): print(HELLO)
这里的.代表当前包(也就是module),这样就能正确获取到__init__.py里定义的HELLO变量了。
方案2:用绝对导入直接从包名获取变量
如果你觉得相对导入不够直观,也可以用绝对导入的方式:
from module import HELLO def bar(): print(HELLO)
这种写法在包结构明确的情况下也能正常工作。
方案3:将__init__.py作为包的公共接口
如果你希望包内多个模块都能方便使用这类公共变量,可以把__init__.py作为包的对外接口,模块统一从包名导入:__init__.py保持不变:
HELLO = "hello"
foo.py使用from module import HELLO(和方案2一致)。这种方式更符合Python包的设计思路,把公共变量集中在__init__.py里管理。
验证修复
修改完foo.py后,再运行python main.py,就能正常输出hello了。
内容的提问来源于stack exchange,提问作者Yohan Obadia
相关产品推荐
相关产品推荐

