如何让Pyright在pre-commit中动态检测当前pyenv环境?
方案1:通过pre-commit钩子参数动态传递虚拟环境路径
无需修改仓库公共的pyproject.toml,直接在.pre-commit-config.yaml的Pyright钩子配置里,用命令行参数动态获取当前pyenv环境的路径和名称:
编辑.pre-commit-config.yaml的Pyright钩子条目:
repos: - repo: https://github.com/RobertCraigie/pyright-python rev: v1.1.350 hooks: - id: pyright args: - --venv-path=$(pyenv root)/versions - --venv=$(pyenv version-name)
每次运行pre-commit时,会自动通过pyenv命令拉取当前环境的路径信息,传递给Pyright,完全不需要硬编码个性化路径到配置文件中。
注意:Windows用户需调整命令格式,比如用
%PYENV_ROOT%\versions和%PYENV_VERSION%替代Linux/macOS的语法。
方案2:用本地私有配置文件覆盖公共配置
创建仅本地生效的Pyright配置文件,添加到.gitignore中避免提交,既保留仓库公共配置,又能自定义个人虚拟环境路径:
- 在项目根目录创建
pyrightconfig.json(或pyproject.local.toml),写入个人虚拟环境配置:
{ "venvPath": "/Users/your-name/.pyenv/versions", "venv": "your-project-venv-name" }
或toml格式的pyproject.local.toml:
[tool.pyright] venvPath = "/Users/your-name/.pyenv/versions" venv = "your-project-venv-name"
- 在
.gitignore中添加该文件,防止提交到仓库:
pyrightconfig.json pyproject.local.toml
- 修改仓库公共的
pyproject.toml,让Pyright优先读取本地配置:
[tool.pyright] # 公共配置项 include = ["src/**/*.py"] exclude = ["venv/**", ".git/**"] # 允许本地配置覆盖公共配置 extendConfigPaths = ["./pyrightconfig.json", "./pyproject.local.toml"]
这样Pyright会先加载公共配置,再读取本地私有配置,每个人可独立设置适合自己的虚拟环境路径。
方案3:让pre-commit钩子使用当前激活的虚拟环境
默认pre-commit会为每个钩子创建隔离环境,导致Pyright无法访问项目虚拟环境的包。可修改钩子配置,强制使用当前激活的环境:
编辑.pre-commit-config.yaml的Pyright钩子:
repos: - repo: https://github.com/RobertCraigie/pyright-python rev: v1.1.350 hooks: - id: pyright language: system entry: pyright
language: system会让pre-commit直接调用当前激活虚拟环境中的pyright命令,Pyright会自动检测当前环境的依赖包,无需额外配置venvPath和venv。
注意:这种方式要求所有开发者运行pre-commit前,必须先激活项目对应的pyenv虚拟环境,且环境中已安装
pyright。
内容的提问来源于stack exchange,提问作者user22638408

