如何从另一个Python脚本访问目标脚本运行时生成的动态变量
问题解答
核心问题原因
你当前没法直接拿到script1.main()里的x,是因为x是main函数的局部变量,仅在函数执行过程中存储在函数调用栈帧里,函数执行完成后栈帧销毁,x就被回收了,外部默认无法访问。
常规实现方案(无需二次调用read_file)
方案1:修改main函数添加返回值(最推荐)
这是耦合度最低、最符合Python规范的实现,只需要给script1的main函数加返回值即可:
# script1.py 修改后 def read_file(): # 补充with上下文管理器避免文件句柄泄漏 with open('file_path.txt', 'r', encoding='utf-8') as f: return f.read() def main(): # 原有前置操作全部保留 x = read_file() # 原有前置操作全部保留 return x # 新增返回x if __name__ == '__main__': main()
script2直接接收返回值即可:
# script2.py 修改后 import script1 def main(): x = script1.main() # 执行main的同时直接拿到x,无重复执行逻辑 print(x) if __name__ == '__main__': main()
方案2:将x存储为script1的模块全局变量(适用于无法修改main返回值的场景)
如果受限于现有规范不能改main的返回值,可以把x存为模块级全局变量,模块全局变量会在模块加载后一直存在,不会随函数执行结束销毁:
# script1.py 修改后 x = None # 先声明模块全局变量 def read_file(): with open('file_path.txt', 'r', encoding='utf-8') as f: return f.read() def main(): global x # 声明此处操作的是全局x,而非函数局部变量 x = read_file() # 原有前置操作全部保留 if __name__ == '__main__': main()
script2执行完main后直接访问模块的全局变量即可:
# script2.py 修改后 import script1 def main(): script1.main() x = script1.x # 直接读取script1模块的全局变量x print(x) if __name__ == '__main__': main()
导入方式选择
优先使用import script1,不推荐使用from script1 import *,原因如下:
from script1 import *会把script1所有的函数、变量导入当前命名空间,极易出现命名冲突- 如果使用
from script1 import x导入全局变量,你拿到的是模块加载那一刻x的静态拷贝,后续script1里x更新后,你这边拿到的还是旧值,无法同步 script1.xxx的写法可读性更高,能明确看出变量/函数的来源,方便后续维护
内容的提问来源于stack exchange,提问作者investigate311
相关产品推荐
相关产品推荐

