如何在Python脚本中访问另一脚本定义的变量?
问题分析
你提到的核心误区是:单独运行reading.py后,该脚本的变量仅存在于自身的Python进程内存中,脚本运行结束后进程退出,内存会被系统回收。后续运行calculation.py是全新的独立进程,完全无法访问前一个进程的内存。而from reading import dataframe_1会重新执行reading.py的顶级代码,导致重复读取CSV,本质是因为Python导入模块时会执行模块内的所有顶级代码。
以下是几种实用解决方案:
方案1:主脚本统一调度(推荐)
将读取和计算逻辑封装为函数,通过主脚本在同一个进程内调用,避免重复读取数据。
修改reading.py
import pandas as pd def load_data(): # 这里放置你的CSV读取及数据处理逻辑 dataframe_1 = pd.read_csv("your_data.csv") # 其他数据预处理函数也可放在此模块中 return dataframe_1
修改calculation.py
def process_data(df): # 这里放置你的计算逻辑 result = df.sum() return result
新增main.py
from reading import load_data from calculation import process_data if __name__ == "__main__": # 仅读取一次数据 df = load_data() # 直接传递内存中的DataFrame给计算函数 calculation_result = process_data(df) print(calculation_result)
运行方式:执行python main.py,所有操作在同一进程内完成,DataFrame无需重复生成。
方案2:持久化缓存数据(适合必须分开运行两个脚本的场景)
如果一定要先运行reading.py再运行calculation.py,可以将生成的DataFrame保存为高效格式(比CSV读取快得多),供calculation.py直接读取。
修改reading.py
import pandas as pd # 读取并处理数据 dataframe_1 = pd.read_csv("your_data.csv") # 其他数据处理逻辑... # 保存为Pickle格式(也可选择Feather/Parquet等更高效的格式) dataframe_1.to_pickle("dataframe_cache.pkl")
修改calculation.py
import pandas as pd # 读取缓存好的DataFrame,无需重新读取CSV dataframe_1 = pd.read_pickle("dataframe_cache.pkl") # 执行计算逻辑 result = dataframe_1.mean() print(result)
运行方式:先执行python reading.py生成缓存文件,再执行python calculation.py读取缓存进行计算。
方案3:进程间通信(复杂场景适用)
如果需要实时共享内存中的数据(比如reading.py持续运行并更新数据),可以使用Python的multiprocessing模块实现进程间通信,示例如下:
修改reading.py
import pandas as pd from multiprocessing import Manager, Process import calculation import pickle def load_and_share_data(shared_dict): dataframe_1 = pd.read_csv("your_data.csv") # 将DataFrame序列化后存入共享字典 shared_dict['data'] = pickle.dumps(dataframe_1) if __name__ == "__main__": with Manager() as manager: shared_dict = manager.dict() # 启动数据读取进程 read_process = Process(target=load_and_share_data, args=(shared_dict,)) read_process.start() read_process.join() # 启动计算进程 calc_process = Process(target=calculation.process_shared_data, args=(shared_dict,)) calc_process.start() calc_process.join()
修改calculation.py
import pandas as pd import pickle def process_shared_data(shared_dict): # 反序列化获取共享的DataFrame dataframe_1 = pickle.loads(shared_dict['data']) # 执行计算逻辑 result = dataframe_1.max() print(result)
该方案适合需要持续数据交互的场景,普通需求推荐前两种方案。
内容的提问来源于stack exchange,提问作者Sirakan
相关产品推荐
相关产品推荐

