QMT客户端里Python包安装在哪里了?

升级到 3.12 之后(升级流程与取舍见上一篇),很多人的第一个疑问不是”怎么升”,而是”我这段代码到底跑在哪个 Python 里”。

这个问题在 3.6 时代几乎不用想:QMT 只有一个内置解释器,装什么库、报什么错,都在同一个篮子里。现在有了第二套环境,同一个 import pandas 在两边拿到的是差了八年的两个东西。所以这篇不讲怎么升级,讲结构——QMT 客户端目录里到底放了什么,import 时按什么顺序找,装包该落到哪个目录。

先交代数据来源:以下目录与文件来自我本机xx证券 QMT 交易端的实际扫描(2026-10-27)。不同券商的路径基本同构,但版本号、文件名可能不一样。

一、先看一张图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<安装目录>\bin.x64\
│
├── python36.dll / pythonw.exe ← 【环境A】Python 3.6 运行时(默认)
├── python36.zip ← 3.6 标准库的压缩备份
├── PythonFormula36.dll ← QMT 调用 3.6 的桥接模块
│
├── Lib\ ← 【环境A】3.6 标准库
│ ├── json.py / os.py / asyncio\ ← Python 官方内置库
│ └── site-packages\ ← 3.6 第三方库
│
├── python312\ ← 【环境B】Python 3.12 运行时(独立目录)
│ ├── python.exe / python312.dll
│ ├── updateQMT312.cfg ← 3.12 环境配置(各版本命名略有差异)
│ └── Lib\site-packages\ ← 3.12 第三方库
│
├── Python36x64_2026-10-27.zip ← 3.6 库包备份
└── python312x64_2026-10-27.zip ← 3.12 库包备份

一句话记住:3.6 摊在 bin.x64\** **根部,3.12 缩在** **bin.x64\python312\ 里。 两套各有自己的解释器、标准库、第三方库,互不共享。

这也解释了一个常见困惑:为什么升级之后,之前装的库”不见了”。不是丢了,是你换到了另一个 site-packages,那边没装过。

二、Lib\ 根下和 site-packages\ 里,是两种东西

打开 bin.x64\Lib\,json.py、os.py、csv.py 直接躺在根下,而 numpy、pandas 全在 site-packages\ 子目录里。这个划分不是 QMT 定的,是 Python 的固定约定。


标准库 第三方库
位置 Lib\ 根下 Lib\site-packages\
来源 随解释器发行包自带,不是装的 pip 安装,或官方库包解压
版本 与解释器绑定,永远是 3.6 版标准库 各自独立(pandas 0.22 配 numpy 1.19,各管各的)
能不能单独升级 不能,只随 Python 版本走 能,pip 随时装、升、卸
例子 json、os、csv、asyncio、sqlite3、ctypes numpy、pandas、sklearn、xtquant

为什么第三方库必须放 site-packages? 三个原因叠在一起:

  1. 发现机制——解释器启动时,内置的 site 模块会专门扫描这个目录并把它加进 sys.path。标准库的路径是硬编码在解释器里的,第三方库靠 site 模块发现。放错位置,import 就是找不到,不是”可能有问题”,是确定找不到。
  2. pip 的默认落点——pip 装任何包,都默认装进当前环境的 site-packages。你不需要指定,但也不能乱放。
  3. 职责分离——标准库跟着 Python 版本走,第三方库独立管理,升级互不干扰。

三、两套环境的组件对照

组件 Python 3.6 Python 3.12
解释器 python36.dll + pythonw.exe python312\python.exe + python312.dll
桥接 DLL PythonFormula36.dll PythonFormula312.dll
标准库 bin.x64\Lib\(另有 python36.zip 备份) bin.x64\python312\Lib\
第三方库 bin.x64\Lib\site-packages\ bin.x64\python312\Lib\site-packages\
默认状态 默认使用 需在策略设置里显式选择

四、三个容易误解的地方

1. python36.zip 不是垃圾,别删。 它和解压出来的 Lib\ 内容相同,是备份。Python 优先用解压目录,zip 只是兜底。删了通常没事,但省不下多少空间,没必要动。

2. .pyd 文件两边不通用。 你会在两套环境里看到同一个 xtquant 250807.1.2,版本号一模一样,但二进制不能互相复制。.pyd 是按 Python 版本编译的(cp36-win_amd64 vs cp312-win_amd64),贴过去就是 ImportError: Module use of python36.dll conflicts。这是升级时最容易犯的错:看到版本一样,就想把整个 site-packages 拷过去图省事。

3. python312\python.exe 能单独跑,但不是策略环境。 它是个完整的解释器,你可以用它调试 xtquant 的连接、跑个小脚本验证库版本。但它不会自动带上 QMT 策略的环境变量与上下文——ContextInfo、行情回调这些东西,还是得在 QMT 界面里跑策略才有。

免责声明

  1. 本文为编程技术研究内容,不构成任何投资建议、荐股意见或收益承诺。
  2. 目录结构、文件名与版本号来自本人本机某券商客户端的实际扫描,不同券商、不同客户端版本的布局可能不同,请以自己的安装目录为准。
  3. 修改客户端目录、拷贝库文件、删除文件前请先备份;因误操作导致的客户端异常、数据丢失由操作者自行承担。
  4. 实盘策略上线前必须在 QMT「模拟信号模式」或「模拟柜台」充分测试。
  5. 涉及账号、账号 key、委托号等敏感信息的日志不得对外分享。
  6. 本文内容按”现状”提供,不保证适用于所有客户端版本。