如何将Jupyter Notebook变量自动共享至本地Flask服务脚本?
Jupyter Notebook与本地Flask服务共享变量的实现方案
这个需求完全可行,下面提供两种适合本地开发的实现方式,操作简单直接:
方式一:同进程变量共享(Jupyter内启动Flask)
这种方式下Flask和Jupyter运行在同一个Python进程中,变量可以直接共享,无需额外存储介质:
- 在Jupyter单元格中启动Flask服务(用线程避免阻塞Notebook):
from flask import Flask, render_template_string import pandas as pd import threading app = Flask(__name__) # 全局变量用于存储共享的DataFrame shared_df = None @app.route('/') def show_df(): global shared_df if shared_df is not None: # 将DataFrame转为带样式的HTML表格 df_html = shared_df.to_html(classes='table table-striped') return render_template_string(''' <html> <head> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body> <div class="container mt-4"> <h2>当前共享的DataFrame</h2> {{ df_html|safe }} </div> </body> </html> ''', df_html=df_html) return "<h2>暂无共享数据</h2>" # 启动Flask线程 def run_flask(): app.run(debug=True, use_reloader=False) # 关闭自动重载,防止全局变量重置 threading.Thread(target=run_flask).start()
- 在另一个Jupyter单元格中更新共享变量:
global shared_df # 生成或处理你的DataFrame shared_df = pd.DataFrame({ '姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 28], '城市': ['北京', '上海', '广州'] })
完成后刷新浏览器访问http://localhost:5000,就能看到最新的DataFrame展示。
方式二:跨进程文件共享(Flask单独运行)
如果需要Flask和Jupyter分开启动(比如Flask作为独立服务运行),可以用本地文件作为中间介质共享数据:
- 编写Flask服务脚本
app.py:
from flask import Flask, render_template_string import pandas as pd import pickle import os app = Flask(__name__) # 定义存储DataFrame的文件路径 SHARED_FILE = 'shared_data.pkl' @app.route('/') def show_df(): if os.path.exists(SHARED_FILE): # 读取最新的DataFrame文件 with open(SHARED_FILE, 'rb') as f: df = pickle.load(f) df_html = df.to_html(classes='table table-striped') return render_template_string(''' <html> <head> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body> <div class="container mt-4"> <h2>当前共享的DataFrame</h2> {{ df_html|safe }} </div> </body> </html> ''', df_html=df_html) return "<h2>暂无共享数据</h2>" if __name__ == '__main__': app.run(debug=True)
- 在Jupyter单元格中保存处理好的DataFrame到共享文件:
import pandas as pd import pickle # 生成处理后的DataFrame processed_df = pd.DataFrame({ '日期': ['2024-01-01', '2024-01-02', '2024-01-03'], '温度': [10, 12, 8], '湿度': [60, 55, 70] }) # 保存到共享文件 with open('shared_data.pkl', 'wb') as f: pickle.dump(processed_df, f)
启动Flask服务后,每次刷新浏览器都会读取最新的文件内容,展示Jupyter中生成的DataFrame。
进阶扩展
如果需要实时自动刷新页面(无需手动刷新),可以结合Flask-SocketIO实现WebSocket推送,Jupyter更新DataFrame后主动通知前端页面刷新,适合对实时性要求高的场景。
内容的提问来源于stack exchange,提问作者Bertrand
相关产品推荐
相关产品推荐

