很多量化开发者习惯在 Linux 服务器上运行 KDB+,但在 Windows 本地搭建开发环境(尤其是结合 Python 的 JupyterQ)时,经常会遇到莫名其妙的 Crash 或路径错误。
本文将提供一份从零开始 的保姆级教程,详细介绍如何下载 KDB+、安装 jupyterq,并重点解决最头疼的 "embedPy requires python 3.6" 误报和 "Fault address" 崩溃问题。
1. 原理:JupyterQ 是如何协同工作的?
在开始安装前,理解它的架构对于排错至关重要。
JupyterQ 并非简单的"在 Python 里调 q",它本质上是一个 Q Kernel。
- Jupyter (Frontend):仅仅是一个交互界面。
- Q Kernel (qpk) :后台运行的是一个真正的
q.exe进程。 - embedPy (Bridge) :这是关键。Q 进程加载
embedPy(p.k/p.q),这实际上是一个动态链接库。 - 这个库会在 Q 进程内部 启动一个 Python 虚拟机 (Python VM)。
- 核心痛点 :Q 启动时必须能找到 Python 的 DLLs (
python3x.dll) 和标准库。如果环境变量没配好,Q 找不到 Python,就会直接崩溃 (Fault address) 或者脚本报错。
2. 准备工作:下载 KDB+ 与获取 License
KDB+ 是商业软件,但 Kx 提供了免费的 个人版 (Personal Edition) 供学习和非商业使用。你需要先去官网申请 License。
第一步:注册并下载
- 访问 Kx 官网下载页:Kdb+ Personal Edition。
- 填写注册表单(建议使用真实邮箱)。
- 根据你的系统选择版本:通常选择 Windows版。
第二步:获取核心文件
提交表单后,你会收到两样东西:
- 软件本体 :一个
.zip压缩包(包含q.exe等文件)。 - License 文件 (
kc.lic) :这是最重要的!Kx 会将此文件发送到你的注册邮箱。
注意 :虽然我们稍后会通过 Conda 安装
jupyterq(它自带了一份 q 的二进制文件),但你需要这封邮件里的kc.lic才能激活它。请务必下载并保存好这个文件。
3. 环境安装 (Step-by-Step)
推荐使用 Anaconda 管理环境,能最大程度避免依赖冲突。
- 系统: Windows 10/11
- 管理工具 : Anaconda / Miniconda (建议安装ananconda,并且默认在c盘防止权限问题,打开终端时候使用管理员,我使用miniconda装的时候不行,要重下anaconda在c盘之后才成功)
- 目标 Python: 建议 3.7 或 3.8 (与 embedPy 兼容性最好)
第一步:创建纯净环境
打开 Anaconda Prompt,执行以下命令:
bash
# 创建名为 kdbq 的环境,指定 Python 3.8
conda create -n kdbq python=3.7
# 激活环境
conda activate kdbq
第二步:安装组件
我们需要安装 embedPy (让 Q 能调 Python) 和 jupyterq (Jupyter 的 Q 内核)。
bash
# 使用 pip 安装 embedPy (通常比 conda 源更稳定)
pip install embedPy
# 安装 jupyterq
conda install -c kx jupyterq
第三步:安装 License
将你在邮件中收到的 kc.lic 文件复制到 Anaconda 环境的 q 目录中。
- 默认路径通常在 :
C:\ProgramData\anaconda3\envs\kdbq\q
或者
C:\Users\你的用户名\anaconda3\envs\kdbq\q
检查方法 :在该目录下应该能看到
w64文件夹和刚放入的kc.lic文件。
4. 关键修正:解决 Windows 特有的 Bug
Windows 环境下直接运行通常会失败,我们需要手动修正两个问题。
修正一:解决 "embedPy requires python 3.6" 误报
问题 :embedPy 的启动脚本 p.q 会尝试调用 cmd 检查 Python 版本,但这在 Windows Conda 环境下经常失效,导致误报。
操作:
- 使用记事本打开文件:
...\envs\kdbq\q\p.q - 找到第 10 行左右的代码:
q
if[(o="w")and `3.6>$first@[system"python3 ",;c;{system"python ",c}];'"embedPy requires python ..."];
- 注释掉它 (在行首加
/):
q
/if[(o="w")and ... <-- 加上斜杠
- 保存并关闭。
修正二:解决 "Fault address" 崩溃 (至关重要)
问题:如果不显式设置环境变量,Q 进程找不到 Python 的 DLL,启动时会直接崩溃。
操作 :
我们需要在启动 Jupyter 前手动"告诉"系统 Python 在哪里。请在 Anaconda Prompt 中依次执行以下命令(每次启动前都要执行,或者保存为 .bat 脚本):
batch
:: 1. 确保在环境中
conda activate kdbq
:: 2. 设置 QHOME (告诉 q 它的家在哪)
:: 注意:请根据你的实际 Anaconda 安装路径修改下面的路径
set QHOME=C:\ProgramData\anaconda3\envs\kdbq\q
:: 3. 设置 PYTHONHOME (救命稻草:防止 embedPy 找不到 Python 核心导致崩溃)
set PYTHONHOME=C:\ProgramData\anaconda3\envs\kdbq
:: 4. 强制将 Python 和 Q 加入 PATH 最前端
set PATH=%PYTHONHOME%;%PYTHONHOME%\Library\bin;%PYTHONHOME%\Scripts;%QHOME%\w64;%PATH%
:: 5. 启动 Jupyter
jupyter notebook
5. 验证安装
- 在 Jupyter Notebook 页面右上角,点击 New -> Q (kdb+)。
- 输入以下测试代码并运行 (Shift+Enter):
q
/ 加载 embedPy
\l p.q
/ 1. 测试基础 Python 打印
.p.eval"print('Hello from Python inside Q!')"
/ 2. 测试数据交换 (numpy)
np:.p.import`numpy
arr:np[`arange](10)
show arr
如果输出了 Hello... 和一个 0-9 的数组,恭喜你!你已经成功打通了 KDB+ 与 Python 的任督二脉。
常见问题速查表
| 现象 | 原因 | 解决方案 |
|---|---|---|
启动报错 license error |
未安装 License | 去 Kx 官网注册下载,将 kc.lic 放入 %QHOME% 目录。 |
启动报错 embedPy requires python 3.6 |
脚本版本检测失效 | 修改 p.q 文件,注释掉版本检查行。 |
内核崩溃 Fault address ... 08 |
找不到 Python DLL | 必须设置 PYTHONHOME 并更新 PATH 变量。 |
| Jupyter 连不上 Kernel | 端口被占用或防火墙 | 重启电脑,或检查防火墙设置。 |