Python中被导入的模块或包如何引用导入方脚本中定义的变量?
实现方案
共有3种常用实现方式,优先推荐第一种显式传参方案,耦合度最低、可维护性最强。
方案1:显式传参(最佳实践)
直接把主脚本的变量作为参数传入导入的函数,不需要依赖模块间的隐式上下文,代码可读性最高。
修改后代码:
pkg/a.py:
def f(var): print(var)
main.py:
from pkg.a import f global_var = 10 f(global_var)
执行后直接输出10,符合预期。
方案2:主动获取主执行模块的属性
如果确实有场景不能修改函数的参数列表,可以通过sys.modules获取到运行入口的__main__模块,直接读取它的全局变量:
仅修改pkg/a.py即可:
import sys def f(): # 从入口模块取指定全局变量 main_module = sys.modules['__main__'] global_var = getattr(main_module, 'global_var', None) print(global_var)
main.py不需要修改,执行后即可输出10。
注意:如果主模块不存在对应变量,getattr会返回None,不会直接抛出异常,可根据需要调整容错逻辑
方案3:给被导入模块动态绑定变量
在主脚本定义完变量后,主动把变量绑定到被导入模块的属性上,被导入模块的函数直接读取自身模块的属性即可:
修改pkg/a.py:
# 可以先定义占位变量,也可以不定义,运行时动态绑定即可 global_var = None def f(): print(global_var)
修改main.py:
from pkg import a from pkg.a import f global_var = 10 # 给a模块动态绑定变量 a.global_var = global_var f()
执行后也能输出10。
注意:方案2和3都存在强耦合问题,被导入模块的逻辑强依赖调用方的变量定义、导入逻辑,后续维护成本高,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者m_ocean
相关产品推荐
相关产品推荐

