You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:35:17