简介:《superset在Windows下安装说明》是一份面向数据分析师、BI平台运维人员及需要在Windows环境快速搭建Superset的开发者查阅的实操型文档,重点解决该开源BI工具在本地部署与中文界面配置中的环境准备和流程衔接问题。压缩包内为1个docx文件,整体约16KB,体量轻便,适合作为部署时的案头参考。该资料已有1478人学习,围绕Superset在Windows下的安装主线,梳理Python与pip前置项、依赖安装、管理员账户创建、数据库初始化、示例数据加载、角色权限初始化以及服务启动与浏览器访问等环节,并补充汉化目录准备、翻译文件获取与config.py语言项配置等内容。读者可据此了解完整的部署脉络,减少环境差异带来的反复试错,并借助汉化配置说明更快进入中文界面开展自助分析与仪表盘制作。
1. Windows 装 SuperSet:真正的坑不在 pip install
在 Windows 上折腾过 SuperSet 的人,大概都经历过同一个场面:pip install superset一路绿灯跑完,接着敲fabmanager却弹出“不是内部或外部命令”。SuperSet 是 Airbnb 开源的 BI 分析与可视化平台,早期叫 Caravel、Panoramix,核心能力就三件事:接多种关系库和大数据引擎、在浏览器里写 SQL 直接出图、把图拼成仪表盘并按角色分权限。它不是那种双击“下一步”就能装完的安装程序,而是一整套 Python 包加一个 Flask 应用,所以 Windows 上的麻烦几乎全堆在“解释器环境”和“命令行入口”这两层。下面这份安装说明,按“先搭环境、再跑服务、最后汉化”的顺序逐条拆开,适合第一次在 Windows 上把 SuperSet 跑起来的人,也适合装过但汉化没生效、示例数据加载失败、图表连不上库的人。
2. 前置环境:为什么 Windows 上总要多装一层
SuperSet 的依赖链大致是 Flask + Flask-AppBuilder + SQLAlchemy + Pandas + 一堆数据库驱动。这套东西在 Linux 上属于常规操作,到 Windows 上就变成“缺编译器、缺驱动、缺入口脚本”的三缺现场。原因不复杂:很多依赖带 C 扩展,官方 PyPI 上有没有对应的预编译 wheel 取决于你的解释器版本和位数,一旦没有,pip 就会回退到源码编译,而 Windows 默认没有 C 编译器。所以前置环境这一步的目标不是“把包装上”,而是“把编译这条路径尽量绕开”。
2.1 先隔离解释器,再谈装不装得上
第一件要做的事不是装包,是确认你到底在用哪个 Python。机器上同时有系统自带的、Anaconda 的、之前项目留下的多个解释器时,pip install装进 A 的 site-packages、python跑的是 B,这种错位在 Windows 上极其常见,症状就是“明明装成功了却提示模块不存在”。我一般会在 D 盘单独建一个目录做隔离环境,路径里不带空格和中文——老版本的打包和脚本对空格路径处理得不好,这是血泪经验。
:: 建一个专用目录,路径不要带空格和中文 mkdir D:\bienv cd /d D:\bienv :: 用当前解释器创建隔离环境 python -m venv venv venv\Scripts\activate :: 核对 python 和 pip 是否指向同一个环境 where python where pip :: 升级打包工具链,让 pip 优先拿预编译 wheel python -m pip install --upgrade pip setuptools wheelpython -m venv venv的第二个venv是目录名,可以随便改,但改完之后下面所有venv\Scripts\...的路径要跟着改。activate执行成功后命令行提示符前面会多出(venv),这是最直观的判断依据;如果没出现,说明你在错误的 shell 里执行了错误的脚本(cmd 和 PowerShell 的激活脚本不是同一个)。where python和where pip必须指向同一个venv目录,这一步别省,后面fabmanager找不到的坑有八成能在这里提前发现。
如果机器上装了多个解释器,python到底指向哪一个不确定,用py -0可以列出所有已注册的版本,py -3.x -m venv venv可以指定版本创建环境。另外,虚拟环境不要建在C:\Program Files这类需要管理员权限的目录下,否则后面改config.py、写translations目录都会碰到权限问题,报错信息还特别含糊。
2.2 编译型依赖:报错多半不是 SuperSet 的错
装 SuperSet 的过程中最常见的失败,报错信息里根本看不到 superset 三个字,全是某个底层库编译失败。这时候不要急着重装,先看报错最后几行是哪个包在编译。下面这张表是我在 Windows 上撞过的几类,处理思路基本通用。
| 依赖 | 典型报错特征 | 常见处理方式 |
|---|---|---|
| sasl / thrift-sasl | Microsoft Visual C++ 14.0 is required | 装 Build Tools,或换不带该依赖的安装方式 |
| cryptography | can't find Rust compiler | 升级 pip 和 setuptools,优先取预编译 wheel |
| psycopg2 | pg_config executable not found | 改用psycopg2-binary,免编译 |
| pyodbc | 编译通过,运行时报驱动未找到 | 装对应的 ODBC 驱动,与 Python 位数一致 |
| pandas / numpy | 长时间卡在Building wheel | 升级 pip,确认解释器位数与 wheel 匹配 |
处理顺序建议是:先python -m pip install --upgrade pip setuptools wheel,再单独试装失败的那个包,看到底是“没有 wheel”还是“有 wheel 但版本不匹配”。如果确实需要编译,装一套 Visual C++ Build Tools 是通用解法,注意勾选 C++ 生成工具组件,只装 IDE 是不行的。另一条路是找第三方预编译轮子,但这会引入来源可信度问题,内网环境要谨慎,能靠官方 wheel 解决就别绕。
还有一个容易被忽略的点:解释器位数。32 位 Python 在 64 位系统上能跑,但很多包的 wheel 只发 64 位,于是你会陷入“别人一条命令装完,你编译半小时”的困境。用python -c "import sys; print(sys.maxsize > 2**32)"输出True就是 64 位。
2.3 数据源驱动与连接串:连不上和画不出图是两件事
SuperSet 本身不直接跟数据库对话,中间隔着一层 SQLAlchemy,所以你要装的是“SQLAlchemy 的方言驱动”,而不是数据库厂商的客户端。搞混这一点,就会出现“驱动装了但连接测试还是失败”的情况。常见数据源的连接串写法如下,格式是方言+驱动://用户:密码@主机:端口/库名。
| 数据源 | 连接串示例 | 需要额外装的包 |
|---|---|---|
| MySQL | mysql+pymysql://user:pass@127.0.0.1:3306/demo | pymysql |
| PostgreSQL | postgresql+psycopg2://user:pass@127.0.0.1:5432/demo | psycopg2-binary |
| SQL Server | mssql+pyodbc://user:pass@dsn名 | pyodbc加系统 ODBC 驱动 |
| SQLite | sqlite:///D:/data/demo.db | 无需额外安装 |
两个细节值得单独说。第一,密码里含@、#、/这类字符时必须做 URL 编码,否则连接串会被解析错位,报错信息通常指向主机名解析失败,很容易误判成网络问题。第二,Windows 下 SQLite 的路径写法是三个斜杠加盘符,sqlite:///D:/data/demo.db,写成反斜杠会直接报路径不存在。
驱动装完之后,建议先在命令行里用 SQLAlchemy 单独测一次连通性,别等到 SuperSet 界面里点“测试连接”才发现问题,那样排查链路太长。
from sqlalchemy import create_engine # 把这里换成你实际的连接串,密码含特殊字符记得 URL 编码 engine = create_engine("mysql+pymysql://user:pass@127.0.0.1:3306/demo") with engine.connect() as conn: # 只取一行,验证账号权限和网络通路 print(conn.exec_driver_sql("select 1").scalar())这段代码的作用是把“SuperSet 的问题”和“驱动/网络/权限的问题”切开。能打印出1,说明驱动、网络、账号三件事都没问题,后面界面上连不上就只可能是连接串填错或者 SuperSet 进程里没装这个驱动(虚拟环境没激活是高频原因)。报错的话,Can't connect to MySQL server指向网络或服务没起,Access denied指向账号权限,No module named指向驱动没装进当前环境。
2.4 元数据库:SQLite 能跑,但别当生产用
SuperSet 自己也需要一个库来存用户、仪表盘、切片这些元数据。默认情况下它用 SQLite,文件落在用户目录下的.superset文件夹里,Windows 上就是%USERPROFILE%\.superset\superset.db。单机试用完全够用,但它的问题是并发写会锁:两个人同时保存图表,就可能看到database is locked。
如果只是自己跑一遍流程、看看界面长什么样,SQLite 最省事,什么都不用配。如果要给团队用,常见做法是换成 PostgreSQL 或 MySQL,然后在config.py里改SQLALCHEMY_DATABASE_URI,指向一个提前建好的空库。这一步必须在执行数据库初始化之前完成,初始化之后再换库,等于把已有的用户和仪表盘全丢了。
3. 六步把服务拉起来:从 pip install 到 8088 登录页
环境备齐之后,安装本身反而很短。这一串命令的顺序不能乱:装包 → 建管理员 → 升级元数据库 → 加载示例 → 初始化权限 → 启动。顺序颠倒的典型后果是建管理员时报“表不存在”,因为元数据库还没建。
3.1 安装与创建管理员:fabmanager 那一代的入口
:: 确认虚拟环境已激活,提示符前应有 (venv) pip install superset :: 创建管理员账号,按提示依次输入用户名、名、姓、邮箱、密码 fabmanager create-admin --app superset :: 如果上面的命令提示"不是内部或外部命令",改用模块方式调用 python -m flask_appbuilder.security.managerpip install superset会把 SuperSet 和它的一大堆依赖一起装上,网络慢的时候建议加国内源,这一步失败大多不是包本身的问题,而是超时。fabmanager create-admin --app superset里的--app superset不能省,它告诉 Flask-AppBuilder 去加载哪个应用的配置;省掉之后它会去找默认应用,报的错跟账号密码毫无关系,容易带偏方向。
fabmanager这个入口是 pip 在Scripts目录下生成的 exe,如果提示找不到,本质上就是Scripts不在 PATH 里,或者你根本没激活虚拟环境。这种时候不用去改系统环境变量,直接用python -m的方式调模块更稳,也更适合写进脚本。密码输入时终端不回显是正常现象,不是卡住了。
3.2 初始化元数据库:为什么要 cd 到 bin 目录
:: 进入 superset 包内的 bin 目录(虚拟环境下路径如下) cd /d D:\bienv\venv\Lib\site-packages\superset\bin :: 升级元数据库,创建所有需要的表 python superset db upgrade这一步是整份说明里最“Windows 特色”的地方。bin目录下的superset是一个没有扩展名的 Python 脚本文件,Windows 下用python 脚本名可以直接执行它。之所以要cd进去,是因为这个脚本在早期版本里对包路径的假设比较脆弱,从别的目录调用容易报导入错误;再加上 pip 生成的入口 exe 有时没进 PATH,用脚本方式执行是最不容易翻车的做法。
db upgrade这个动作是幂等的,重复执行不会把数据清空,它只把元数据库的结构升级到当前代码对应的版本。如果这一步报错,先看元数据库文件是不是被别的进程占着(比如上一次没退干净的 SuperSet 进程),把.superset目录下的 db 文件删掉重来在试用阶段是可接受的,但生产环境千万别这么干。
如果手上的包已经是新的入口形式,上面这一串可以简化成superset db upgrade、superset fab create-admin、superset init、superset run,参数名从runserver变成run,fabmanager变成superset fab。判断标准很简单:在Scripts目录下看有没有superset.exe,有就走新入口。
3.3 加载示例与初始化权限:load_examples 和 init
:: 仍在 bin 目录下执行 python superset load_examples :: 初始化角色和权限,把菜单、视图权限写进元数据库 python superset initload_examples会往元数据库里写一批示例数据集、图表和仪表盘,好处是第一次登录进去不是空白页,能直接看到切片、仪表盘长什么样,方便判断“到底是没数据还是功能坏了”。代价是它会往元数据库里塞不少表,如果后面打算换成正式库,这一步跳过也行。
init这一步经常被跳过,后果是登录进去菜单少一大半,或者点某个页面提示权限不足。它做的是把代码里定义的角色、权限、菜单项同步到元数据库,属于“代码改了权限也要跟着刷”的补偿动作。升级包之后如果发现新菜单没出现,重跑一次init通常就能解决。
3.4 启动与端口:runserver -d 和 -p
:: 默认 8088 端口启动,-d 表示调试模式 python superset runserver -d :: 换端口,比如 8089 python superset runserver -d -p 8089 :: 需要局域网内其他机器访问时,指定监听地址 python superset runserver -d -h 0.0.0.0 -p 8088-d是调试模式,好处是改了配置不用手动重启,坏处是性能差、异常信息会直接暴露在页面上,只适合本地调试,别拿它当服务跑。-p改端口,-h改监听地址,默认只监听本机,所以同一局域网的其他电脑访问不了——这不是防火墙的问题,是服务压根没监听对外地址。
启动成功后命令行会打印访问地址,浏览器打开http://localhost:8088就能看到登录页,用 3.1 建的管理员账号登进去。如果页面能打开但登录后白屏,先看命令行有没有抛异常,再看浏览器控制台是不是静态资源 404,这两种情况的排查方向完全不同。
4. 汉化落地:建目录、放 mo、改 config.py 三件事
汉化这件事看起来只是“放个文件改个配置”,实际翻车率不低,因为涉及的路径有两套:一套是翻译文件放在哪,一套是配置告诉程序去哪找。这两套要是对不上,表现就是“配置改了、服务重启了、界面还是英文”。
4.1 translations/zh/LC_MESSAGES 到底建在哪
:: 进入 superset 包目录 cd /d D:\bienv\venv\Lib\site-packages\superset :: 逐级创建翻译目录 md translations cd translations md zh cd zh md LC_MESSAGES这三个目录名一个都不能改,LC_MESSAGES是 gettext 的约定,zh是 locale 标识,写错成zh_CN或chinese都不会被加载。建好之后把messages.mo放进去,路径应该是superset\translations\zh\LC_MESSAGES\messages.mo。
放在这个位置有个隐患:它在虚拟环境的site-packages里,升级或重装 SuperSet 时会被整个覆盖掉。我的做法是在项目目录下留一份messages.mo的备份,升级完再拷回去,比重新下载省事。
4.2 po 与 mo:msgfmt 编译与自己补词条
mo是编译后的二进制文件,程序运行时读的是它;po是给人看的源文件,一行msgid一行msgstr。用官方现成的mo最省事,但覆盖率不可能是 100%,总有些菜单项还是英文。想自己补,就下po文件,改完再编译。
:: 需要先装 gettext for windows,把 bin 目录加进 PATH msgfmt messages.po -o messages.mo :: 验证生成的 mo 是否可读,能列出条目说明文件没坏 msgunfmt messages.momsgfmt的两个参数含义是:输入文件在前,-o指定输出文件。编译失败常见原因是po文件里msgstr的引号或换行被编辑器改坏了,用纯文本编辑器改、别用 Word,改完记得存成 UTF-8 无 BOM。msgunfmt是反向校验,能正常输出条目就说明产物可用。改po的时候要注意msgid一个字符都不能动,那是程序查找的键。
4.3 config.py 的三处改动与重启验证
# 默认语言设为中文 BABEL_DEFAULT_LOCALE = 'zh' # 翻译文件搜索路径(部分版本沿用此配置) BABEL_DEFAULT_FOLDER = 'babel/translations' # 允许的语言列表,只保留中文可以省掉切换菜单 LANGUAGES = { 'zh': {'flag': 'cn', 'name': 'Chinese'} }改的是superset包目录下的config.py。BABEL_DEFAULT_LOCALE决定默认语言,这是最关键的一行;LANGUAGES决定语言下拉框里有哪些选项,把英文注释掉之后就只剩中文,避免误切。BABEL_DEFAULT_FOLDER这一行值得单独提醒:它的值和实际的翻译目录并不一致,在很多版本里并不起作用,真正生效的是superset/translations这个固定位置。所以如果你的界面没变中文,先别怀疑这一行,回去确认messages.mo的路径对不对。
改完必须重启服务,Ctrl+C停掉再重新runserver。重启之后建议开一个无痕窗口访问,或者强制刷新(Ctrl+F5),因为浏览器会缓存静态资源和页面。改config.py还有一个更稳的做法:用环境变量SUPERSET_CONFIG_PATH指向你自己维护的一份配置文件,这样升级包的时候不会被覆盖,多人协作时也方便把配置纳入版本管理。
5. 避坑与排查:五条踩过的记录
5.1 提示 fabmanager 不是内部或外部命令
现象:pip install superset显示成功,紧接着执行fabmanager create-admin --app superset报“不是内部或外部命令,也不是可运行的程序”。
原因:pip 生成的入口 exe 落在虚拟环境的Scripts目录下,而这个目录不在当前 shell 的 PATH 里;或者你压根没激活虚拟环境,pip 装到了全局解释器里,当前 shell 找不到。
解决:先where python和where pip确认两者同一个环境,再确认Scripts目录下有fabmanager.exe。有就把它所在目录临时加进 PATH,没有就用python -m方式调模块,或者直接进site-packages\superset\bin用python superset执行。不要在没搞清楚环境的情况下反复重装,重装十次也解决不了 PATH 问题。
5.2 汉化后只有登录页变中文
现象:登录页是中文,登进去之后菜单、按钮、图表配置项还是英文。
原因:mo文件里的词条覆盖不全,官方翻译本来就只覆盖了一部分;另一种可能是你放了旧版本的mo,msgid和新代码里的字符串对不上,匹配不到自然就不翻译。
解决:用msgunfmt messages.mo看文件里的msgid有没有对应你想汉化的词,没有就自己补进po再编译。补的时候注意msgid必须和界面上的英文原文完全一致,多一个空格都不行。这部分属于体力活,建议只补自己团队高频用到的几十个词,别想着一次补完。
5.3 升级或重装后汉化失效
现象:之前明明汉化好了,pip install --upgrade superset之后界面又变回英文,translations目录也不见了。
原因:translations目录和config.py都在site-packages里,属于包的一部分,升级时会被整体替换。
解决:把messages.mo和自己的config.py备份到项目目录,升级后拷回。更好的做法是用SUPERSET_CONFIG_PATH环境变量指向外部配置文件,从根上避免被覆盖。这个坑我吃过一次之后,凡是改包内文件的定制,一律先备份再动手。
5.4 database is locked 或初始化卡住不动
现象:执行db upgrade或保存图表时报database is locked,或者命令一直卡着不返回。
原因:默认的 SQLite 元数据库不支持高并发写,上一次没退干净的 SuperSet 进程还占着文件句柄;Windows 下文件锁释放比 Linux 慢,进程杀了但句柄还在的情况并不少见。
解决:先确认没有残留的 python 进程占着.superset\superset.db,任务管理器里结束掉再重试。频繁出现就说明 SQLite 撑不住了,换 PostgreSQL 或 MySQL 做元数据库,改SQLALCHEMY_DATABASE_URI后重新跑一遍初始化。试用阶段实在搞不定,删掉 db 文件重来是最快的,但要清楚这会丢掉已有的仪表盘。
5.5 端口占用与局域网访问不了
现象:runserver报端口被占用;或者本机能打开,同事的电脑打不开。
原因:8088 被别的程序占了;或者启动时没指定监听地址,服务只绑在127.0.0.1上。
解决:用-p换一个端口,换完记得浏览器地址也跟着改,别对着旧地址刷新半天。局域网访问加-h 0.0.0.0,同时确认 Windows 防火墙对 python 进程放行。这两件事要分开验证:先在本机localhost:端口能开,再让同事访问,否则你分不清是服务没起还是网络不通。
6. 把初始化流程脚本化:一份可复用的 bat 与验收清单
这一串命令敲过三遍之后,我就把它们写成了一个 bat。原因很实际:每次换机器、每次重装、每次帮同事搭环境,手工敲都会在某个环节漏一步,而漏的那一步往往要半小时后才以另一个错误的形式暴露出来。
@echo off setlocal cd /d D:\bienv call venv\Scripts\activate :: 1. 装包,失败就停,不要带着半成品继续 python -m pip install --upgrade pip wheel || goto :fail pip install superset || goto :fail :: 2. 元数据库升级,幂等,可以重复跑 superset db upgrade || goto :fail :: 3. 建管理员,参数直接给全,避免交互式输入漏填 superset fab create-admin --app superset ^ --username admin --firstname a --lastname b ^ --email admin@example.com --password ChangeMe123 || goto :fail :: 4. 权限与菜单同步 superset init || goto :fail :: 5. 启动,换端口改这里的 8088 superset run -p 8088 -h 0.0.0.0 goto :eof :fail echo [ERROR] 上一步失败,检查上面的输出 exit /b 1这个脚本里两个设计值得说一下。一是|| goto :fail,每步失败立刻中断,不要让错误累积——db upgrade失败还继续建管理员,最后报的错会指向“表不存在”,误导性极强。二是create-admin用参数把用户名密码一次给全,交互式输入在脚本里没法自动化,而且密码输错一次就得重来。密码别用示例里的,改成自己的,并且清楚这个账号是超级管理员。
如果手上的包已经是新入口形式,把superset fab create-admin之外的三条命令保持不变即可;如果还是fabmanager那一代,就把第 3 步和第 5 步换成fabmanager create-admin --app superset和superset runserver -d -p 8088,其余不动。
跑完之后按下面的清单逐项过一遍,比“看起来能打开”靠谱得多:
| 验收项 | 通过标准 | 不通过先查什么 |
|---|---|---|
| 服务启动 | 命令行打印访问地址,无异常堆栈 | 端口占用、元数据库被锁 |
| 登录 | 管理员账号能进,不白屏 | 浏览器控制台静态资源、init是否执行 |
| 菜单完整 | 数据源、图表、仪表盘入口都在 | 重跑superset init |
| 汉化 | 菜单和主要按钮为中文 | mo路径、BABEL_DEFAULT_LOCALE |
| 数据源连接 | 测试连接返回成功 | 驱动是否装进当前虚拟环境 |
| 出图 | 选库选表能出图并保存 | 连接串权限、字段类型 |
最后说个习惯。从那以后我每次在 Windows 上搭这类 Python 服务,都强制走一遍“先where python和where pip对齐环境、再单独验证编译型依赖、最后才装主包”的顺序,绝不因为某次一路绿灯就跳过。这个顺序看着慢,实际省下的是后面两小时的瞎猜时间。这份安装说明的每一步我都对着上面这些环节核过,你按自己的路径替换掉D:\bienv就能直接用,碰到报错先按第 5 章的现象对号入座,八成能定位到。希望帮到你。
本文还有配套的精品资源,点击获取