[Bug] 桌面版打包缺失 py_mini_racer 运行时文件,导致「筹码分布」100% 失败

Author: YHQS1997Created Sep 24, 2026Updated Sep 24, 2026

[Bug] 桌面版打包缺失 py_mini_racer 运行时文件,导致「筹码分布」100% 失败

环境

项 值
软件版本 v3.32.0(桌面版 Electron,构建时间 2026-09-06)
系统 Windows 11 x64
Python(打包内) 3.12
akshare 打包内置(requirements.txt 约束 >=1.12.0)
数据源 博查 Bocha(新闻)+ 东财系(行情/筹码)

问题描述

「筹码分布」功能在桌面版上 100% 失败,报告里固定显示为:

筹码分布未启用或数据源暂不可用,未纳入筹码判断。

该问题与网络无关,重跑分析无效,属于打包缺陷。

复现步骤

  1. 安装桌面版 v3.32.0(默认配置,ENABLE_CHIP_DISTRIBUTION 未显式设置 = 走默认)
  2. 对任意 A 股跑一次「个股分析」
  3. 查看日志 logs/stock_analysis_*.log

报错原文

[API调用] ak.stock_cyq_em(symbol=600737) 获取筹码分布...
[API错误] 获取 600737 筹码分布失败: Native library or dependency not available at
E:\...\resources\backend\stock_analysis\_internal\py_mini_racer\mini_racer.dll
[筹码分布] 600737 所有数据源均失败

根因定位

1) py_mini_racer 的运行时文件整体缺失

报错点名的目录根本不存在:

bash
$ ls "resources/backend/stock_analysis/_internal/py_mini_racer/"
❌ 目录不存在

$ find . -iname "*mini*"
# 全盘无任何匹配

而 Python 侧的模块是打包进去了的(否则会报 ModuleNotFoundError,而不是这个 DLL 查找失败)。

结论:PyInstaller 打包时漏收了 mini_racer 包里的数据文件。 akshare 的 ak.stock_cyq_em(筹码分布)依赖 py_mini_racer(V8 引擎,用于执行 JS 解密东财响应), 引擎文件缺失 → 该功能永久不可用。

2) 需要哪个版本:mini-racer 0.13.2

两处证据交叉锁定版本:

(a) akshare 的依赖声明(pip show akshare / PyPI requires_dist):

mini-racer>=0.12.4; platform_system != "Linux"
py-mini-racer>=0.6.0; platform_system == "Linux"

→ Windows 侧必须用 mini-racer(新包名),且 ≥0.12.4。

(b) 用符号名反查版本

放入 0.12.4 的文件后,报错变为:

获取 002119 筹码分布失败: function 'mr_array_push' not found

说明文件已全部找到、DLL 加载成功,只是符号版本不匹配。 实测各版本的符号导出:

版本 导出 mr_array_push 可用
0.6.0 (py-mini-racer) ❌ ❌
0.12.4 ❌ ❌
0.13.0 ❌ ❌
0.13.2 ✅ ✅
0.14.1 ✅ ✅

3) 需要补的文件(不同版本文件集不同,注意别混用)

版本 需要的数据文件
0.12.4 mini_racer.dll + icudtl.dat + snapshot_blob.bin
0.13.2 / 0.14.1 mini_racer.dll + icudtl.dat(无 snapshot_blob.bin)

⚠️ 混用(如 0.12.4 的 dll + 0.13.2 的 icudtl.dat)会导致 V8 数据错配。

验证:手工补齐后功能恢复正常

把 mini-racer 0.13.2 的 mini_racer.dll(27.56 MB)+ icudtl.dat(10.32 MB) 放入 _internal/py_mini_racer/ 后重启,实测:

[API返回] ak.stock_cyq_em 成功: 返回 90 天数据, 耗时 3.38s
[筹码分布] 600737 成功获取 (来源: AkshareFetcher)  获利比例=36.6%, 90%集中度=21.80%
[筹码分布] 002119 成功获取 (来源: AkshareFetcher)  获利比例=99.7%

数据块状态由 missing 变为 available,chip_distribution_raw 由 null 变为有数据。零报错。

建议修复

在打包配置(PyInstaller spec / 构建脚本)中显式收集 mini_racer 的数据文件:

python
# 伪代码:按平台收集
from importlib.util import find_spec
import os, glob
pkg = os.path.dirname(find_spec("py_mini_racer").origin)
datas = [
    (os.path.join(pkg, "mini_racer.dll"),  "py_mini_racer"),   # Windows
    (os.path.join(pkg, "icudtl.dat"),      "py_mini_racer"),
    # macOS 为 libmini_racer.dylib,Linux 为 libmini_racer.so
]

或使用 PyInstaller.utils.hooks.collect_data_files("py_mini_racer")。

同时建议加一条启动自检:若 py_mini_racer 不可用,日志里给一条明确的 WARNING, 而不是等到用户跑分析时才在 ak.stock_cyq_em 里抛错 —— 现在这个报错太底层,用户难以自查。


附:同一次排查中发现的其他数据可用性问题

以下 3 项是独立问题,一并附上证据供参考(如需要我可另开 issue)。

A. capital_flow 取数挂死(不是慢)

配置放大超时无效,坐实是阻塞 bug。证据:

json
"capital_flow": {
  "status": "failed",
  "errors": ["capital_flow timeout"],
  "source_chain": [{"provider": "fundamental_pipeline",
                    "result": "failed",
                    "duration_ms": 45000}]
}
  • 我把 FUNDAMENTAL_FETCH_TIMEOUT_SECONDS 设为 45,duration_ms 就是 45000
  • 改成 120/45 后,依然是 duration_ms=45000,只是每次分析白等 45 秒 (分析总耗时从 ~90 秒涨到 4 分钟以上)
  • 判据:duration_ms ≈ 你设的超时值 ⇒ 是「挂死」而非「预算不足」

与 #2247(新增妙想(MX_API)补充数据源(筹码分布/个股资金流))相关。

同时确认 ENABLE_EASTMONEY_PATCH=true + FUNDAMENTAL_STAGE_TIMEOUT_SECONDS=45 / FUNDAMENTAL_FETCH_TIMEOUT_SECONDS=15 可以修好另外 3 项: earnings / dragon_tiger / boards 由 failed → ok,concept_boards → partial。 (默认值 8.0 / 3.0 太短:数据源回退链实测耗时 73.49 秒)

B. growth / institution 恒为 partial:akshare 函数级报错

stock_yjyg_em:TypeError        # 业绩预告
stock_yjkb_em:TypeError        # 业绩快报
stock_gdfx_top_10_em:KeyError  # 十大股东

疑为 akshare 与你调用的东财接口字段变更导致,非配置问题。

C. .env 的 AGENT_EVENT_ALERT_RULES_JSON 与 DB alert_rules 两套数据不同步

用户通过 Web 告警中心增删规则时,.env 那份不会跟着变。 在 SCHEDULE_ENABLED=true 时两份都活着,容易出现「已清仓股票仍在告警」的幽灵规则。 建议合并为单一数据源,或在文档里明确二者的职责边界。


本 issue 由用户实际排障过程整理,所有日志均为真实输出(已隐去本机用户名)。 如需要,我可以提供可直接复现的最小验证脚本。

Source: ZhuLinsen/daily_stock_analysis