Python中如何跨模块导入更新后的中间变量与全局变量?
问题分析与解决方案
一、模块内函数变量无法跨模块获取更新值的问题
你在module1.py里的问题核心是函数内的变量是局部变量,和模块级的同名变量并非同一对象。即便你在模块顶部初始化了intermediate_variable = None,函数里未声明global时,赋值操作只会创建一个新的局部变量,不会修改模块级的那个变量,因此其他模块导入后只能拿到初始的None。
修正后的module1.py:
intermediate_variable = None def calculate(): global intermediate_variable # 执行计算逻辑 intermediate_variable = 42 # 无限循环示例 while True: pass
在module2.py中获取更新后的值:
import module1 import threading # 启动calculate线程避免主线程阻塞 threading.Thread(target=module1.calculate, daemon=True).start() # 等待变量更新(可根据实际场景调整等待逻辑) while module1.intermediate_variable is None: pass print(module1.intermediate_variable) # 输出42
二、Deephaven执行上下文dh_exec_ctx跨模块导入的问题
你的实际场景中,问题有两点:
run_deephaven()仅在模块作为主程序运行时(if __name__ == '__main__')才会执行,其他模块导入时该函数不会自动运行,导致dh_exec_ctx始终为None。- 即便手动启动线程执行
run_deephaven(),线程执行需要时间,直接获取可能还未完成赋值,需要同步机制等待。
修正后的Deephaven模块代码(示例命名为deephaven_setup.py):
from threading import Thread, Condition from deephaven_server import Server dh_exec_ctx = None cv = Condition() def run_deephaven(): global dh_exec_ctx server = Server() server.start() from deephaven.execution_context import get_exec_ctx with cv: dh_exec_ctx = get_exec_ctx() cv.notify_all() # 通知等待的线程变量已更新 # 若需模块导入时自动启动,可移除下面的if判断;若需手动控制则保留 if __name__ == '__main__': run_deephaven()
在其他模块中导入并获取dh_exec_ctx:
import deephaven_setup import threading # 启动Deephaven服务线程 threading.Thread(target=deephaven_setup.run_deephaven, daemon=True).start() # 等待dh_exec_ctx完成赋值 with deephaven_setup.cv: deephaven_setup.cv.wait_for(lambda: deephaven_setup.dh_exec_ctx is not None) # 此时可正常使用dh_exec_ctx print(deephaven_setup.dh_exec_ctx)
内容的提问来源于stack exchange,提问作者Ussu20
相关产品推荐
相关产品推荐

