如何更新另一文件中的变量?Python跨文件变量访问问题
解决方案
首先澄清你的误解:直接运行test.py和test2.py时,test.py的主循环不会被执行两次。因为if __name__ == '__main__':代码块只有在直接运行该文件时才会触发,当test2.py导入test模块时,__name__的值是'test'而非'__main__',所以test.py里的while True循环不会在test2.py的进程中启动。
但你的核心问题是两个独立进程无法直接共享内存变量——test2.py中访问的test.variables是它自己进程内的副本,和test.py进程里的variables完全无关,所以test.py对变量的修改,test2.py根本看不到。要实现两个进程共享变量并分别运行,需要用进程间通信(IPC)机制,以下是两种可行方案:
方案1:用文件作为共享存储
通过读写本地文件来同步变量,适合简单场景:
修改test.py
import time import schedule import json # 定义共享变量的存储文件 VARS_FILE = "shared_vars.json" def load_variables(): """从文件加载变量,文件不存在则返回初始值""" try: with open(VARS_FILE, "r") as f: return json.load(f) except FileNotFoundError: return [1, 2, 3] def save_variables(vars_list): """将变量写入文件""" with open(VARS_FILE, "w") as f: json.dump(vars_list, f) def augment(): """读取变量、修改、再保存""" variables = load_variables() for i in range(3): variables[i] += (i + 1) save_variables(variables) schedule.every().second.do(augment) if __name__ == '__main__': # 初始化文件(避免首次运行时文件不存在) save_variables(load_variables()) while True: schedule.run_pending() time.sleep(1)
修改test2.py
import time import schedule from test import VARS_FILE, load_variables def take_a_look(): """从文件读取最新变量并打印""" print(load_variables()) schedule.every(5).seconds.do(take_a_look) while True: schedule.run_pending() time.sleep(1)
现在你可以分别启动test.py和test2.py,它们通过本地文件同步变量,完全独立运行。
方案2:用multiprocessing.Manager实现共享内存
适合需要更高性能的场景,通过Python的多进程管理器创建跨进程共享的变量:
重构test.py
import time import schedule def augment(variables): """修改共享变量""" for i in range(3): variables[i] += (i + 1) def run_augment_loop(variables): """启动增强任务的循环""" schedule.every().second.do(augment, variables) while True: schedule.run_pending() time.sleep(1) if __name__ == '__main__': # 单独运行时,初始化共享变量并启动循环 from multiprocessing import Manager with Manager() as manager: shared_vars = manager.list([1, 2, 3]) run_augment_loop(shared_vars)
修改test2.py
import time import schedule from multiprocessing import Process, Manager import test def take_a_look(variables): """打印共享变量""" print(variables) def run_monitor_loop(variables): """启动监控任务的循环""" schedule.every(5).seconds.do(take_a_look, variables) while True: schedule.run_pending() time.sleep(1) if __name__ == '__main__': with Manager() as manager: shared_vars = manager.list([1, 2, 3]) # 启动test.py的增强进程 augment_process = Process(target=test.run_augment_loop, args=(shared_vars,)) augment_process.start() # 启动本地监控循环 run_monitor_loop(shared_vars) augment_process.join()
这个方案中,test.py可以单独运行,也可以通过test2.py启动;如果要完全分开运行,你可以把共享变量的Manager配置成跨进程可访问的(比如自定义远程管理器),不过对于本地场景,文件方案已经足够简单。
内容的提问来源于stack exchange,提问作者MIKIBURGOS
相关产品推荐
相关产品推荐

