fix(env): 钉死 pyright 的分析目标,修掉"无法解析导入 numpy/pandas"
现象:编辑器 / pyright 满屏 reportMissingImports,但 .venv 与 conda 环境里 import numpy, pandas 都正常,pytest 也全过。 根因两层: 1. pyright 没配 venvPath / pythonPath 时会去 PATH 上找 python。本机 PATH 上 唯一的 python 是 agent-tools 的 shim(Codex 运行时,Python 3.14),没有科学栈。 pyright --verbose 显示它选了 3.14.6,Search paths 里一个 Anaconda 路径都没有。 注意持久化的 User/Machine PATH 并没有这一项,是 Codex 进程临时注入的——所以 "我的终端没问题"和"工具有问题"可以同时成立。 2. .venv 是 --system-site-packages 建的,三方包在 D:\anaconda\Lib\site-packages, 而 pyright / Pylance 不认 pyvenv.cfg 的 include-system-site-packages, 只去 .venv\Lib\site-packages 找(那里只有 pip)。 pyright 不读 pyvenv.cfg,但**认 .pth**。 改动: - pyproject.toml [tool.pyright]:venvPath = "." / venv = ".venv" / pythonVersion = "3.13",并注释了为什么必须写 - scripts/setup-venv.ps1:新增第 [2/4] 步,自动往 .venv 写 _mcm_base_site_packages.pth 指向该机 base 的 site-packages,换机重建即可 - tests/test_data.py:3 处 isna().all() 断言外面套 bool()(它的类型是 Series | bool,直接当条件 pyright 报"条件操作数无效"); 2 处故意传错类型的用例加 type: ignore[arg-type] 结果:pyright 17 errors -> 0 errors / 0 warnings;pytest 两套环境均 40 passed, 44 skipped;ruff All checks passed;setup-venv.ps1 通过 AST 解析 (纯 ASCII + LF)。 文档:docs/04-environment.md 新增坑 7(含 pyright --verbose 诊断口诀与 VS Code / PyCharm 的操作步骤)、STATUS 决策 29、CHANGELOG。
This commit is contained in:
1 parent
6758e81c9d
commit
97a2f95066
6 files changed
+107
-9
No files matched your search
@@ -164,6 +164,70 @@ Move-Item -LiteralPath 'D:\anaconda\Lib\site-packages\zstandard' `
|
||||
改名后 `import zstandard` 变成正常的 `ModuleNotFoundError`,pandas 会安静地跳过它。
|
||||
本次已按此处理,`.venv` 的 `pd.read_csv` 恢复正常。
|
||||
|
||||
**坑 7 —— 编辑器报"无法解析导入 numpy / pandas",但解释器明明是对的。**
|
||||
|
||||
现象:`.venv` 与 conda 环境里 `import numpy, pandas` 都正常,pytest 也全过,
|
||||
只有编辑器/pyright 满屏 `无法解析导入"numpy"`。
|
||||
|
||||
原因是**静态分析器自己挑了一个 python**,跟你运行代码用的那个没关系。本机上
|
||||
`pyright --verbose` 一跑就露馅:
|
||||
|
||||
```text
|
||||
Assuming Python version 3.14.6.final.0
|
||||
Search paths:
|
||||
c:\Users\guzhu\AppData\Roaming\Python\Python314\site-packages
|
||||
c:\Users\guzhu\AppData\Local\Python\pythoncore-3.14-64\Lib\site-packages
|
||||
... <- 一个 Anaconda 路径都没有
|
||||
```
|
||||
|
||||
那个 3.14 来自 PATH 上的 `python`,而 PATH 上的 `python` 是本机唯一的 python:
|
||||
|
||||
```text
|
||||
where python -> C:\Users\guzhu\agent-tools\bin\python.cmd
|
||||
\-> C:\Users\guzhu\.cache\codex-runtimes\...\python\python.exe
|
||||
```
|
||||
|
||||
**Codex 运行时的 shim**(Python 3.14,没有 numpy/pandas)。分析器从 PATH 找到它,
|
||||
自然解析不到科学栈。注意持久化的 User/Machine PATH 里**并没有**这一项,
|
||||
它是被 Codex 进程临时注入的——所以"我的终端里没问题"和"工具有问题"可以同时成立。
|
||||
|
||||
还有第二层原因:`.venv` 是 `--system-site-packages` 建的,三方包都在
|
||||
`D:\anaconda\Lib\site-packages`,而 **pyright / Pylance 不认 `pyvenv.cfg` 里的
|
||||
`include-system-site-packages`**,只会去 `.venv\Lib\site-packages` 找——
|
||||
那里只有 `pip`,于是照样报解析不到。
|
||||
|
||||
修法(两件事都要做):
|
||||
|
||||
1. 在 `pyproject.toml` 里把分析器钉到工作区 venv,别让它去 PATH 上碰运气:
|
||||
|
||||
```toml
|
||||
[tool.pyright]
|
||||
venvPath = "."
|
||||
venv = ".venv"
|
||||
pythonVersion = "3.13" # 不写就跟着 PATH 上那个 3.14 走
|
||||
```
|
||||
|
||||
2. 在 `.venv\Lib\site-packages` 放一个 `.pth` 指向 base 的 site-packages。
|
||||
pyright **不读** `pyvenv.cfg`,但**会读 `.pth`**:
|
||||
|
||||
```powershell
|
||||
& 'D:\anaconda\python.exe' -c "import sysconfig; print(sysconfig.get_paths()['purelib'])"
|
||||
# 把输出的那一行原样写进 .venv\Lib\site-packages\_mcm_base_site_packages.pth
|
||||
```
|
||||
|
||||
`scripts/setup-venv.ps1` 已经自动做这一步(第 [2/4] 步),换机重建 `.venv` 不用手动补。
|
||||
|
||||
改完 pyright 从 `17 errors` 掉到 `0 errors`。IDE 侧还要各做一件事:
|
||||
|
||||
* **VS Code / Cursor**:`Ctrl+Shift+P` → Python: Select Interpreter → 选
|
||||
`D:\anaconda\envs\mcm-toolkit\python.exe`(或 `.venv\Scripts\python.exe`),
|
||||
然后 Developer: Reload Window。Pylance 有缓存,不重载不生效。
|
||||
* **PyCharm**:Settings → Project → Python Interpreter 选同一个,
|
||||
再 File → Invalidate Caches / Restart。
|
||||
|
||||
**一句诊断口诀**:编辑器说"解析不到包"时,先跑 `pyright --verbose` 看它的
|
||||
`Search paths`,而不是先去 `pip install`。
|
||||
|
||||
---
|
||||
|
||||
## 五、两套环境的实际版本(已对齐)
|
||||
|
||||
Reference in new issue
Block a user