如何在跨平台场景下通过pre-commit使用指定虚拟环境的mypy?
跨平台配置pre-commit + mypy(PDM虚拟环境)
方案一:利用PDM自动管理虚拟环境(推荐)
直接通过pdm run调用项目虚拟环境中的mypy,无需手动区分系统路径。在项目的.pre-commit-config.yaml中添加本地钩子:
repos: # 保留其他已配置的钩子... - repo: local hooks: - id: mypy name: mypy entry: pdm run mypy . language: system types: [python] pass_filenames: false
说明:
pdm run会自动识别当前项目的.venv虚拟环境,无论Windows还是Linux,都能正确调用对应环境的Python解释器和mypy。language: system表示使用系统环境中的PDM(需确保PDM已全局安装并配置到环境变量)。- 若需要只校验本次提交的文件,可将
pass_filenames改为true,并把entry调整为pdm run mypy(让pre-commit自动传递提交的文件名)。
方案二:动态判断系统路径(自定义脚本)
如果不想依赖PDM全局调用,可编写简单脚本自动识别系统路径后调用mypy:
- 在项目根目录创建
scripts/mypy_runner.py:
import os import subprocess import sys # 根据系统确定虚拟环境Python路径 if sys.platform == "win32": venv_python = os.path.join(".venv", "Scripts", "python.exe") else: venv_python = os.path.join(".venv", "bin", "python") # 调用mypy并传递输出 subprocess.run( ["mypy", "--python-executable", venv_python, "."], check=True, stdout=sys.stdout, stderr=sys.stderr )
- 在
.pre-commit-config.yaml中配置本地钩子:
repos: # 保留其他已配置的钩子... - repo: local hooks: - id: mypy name: mypy entry: python scripts/mypy_runner.py language: system types: [python] pass_filenames: false
说明:
- 脚本通过
sys.platform判断当前系统,自动匹配虚拟环境的Python路径。 - 需确保项目虚拟环境中已安装mypy,可通过
pdm add -d mypy添加为开发依赖。
注意事项
- 确保项目根目录存在
.venv虚拟环境,可通过pdm venv create创建。 - 使用方案一时,需保证PDM已在系统环境中可用(Windows需配置环境变量,Linux需确保PDM在PATH路径中)。
内容的提问来源于stack exchange,提问作者Chuang Men
相关产品推荐
相关产品推荐

