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

如何更新另一文件中的变量?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:24:51