在 Windows 上编译 Python 的 C 扩展
在 Windows 上编译 Python C 扩展时,构建过程必须使用与当前 Python 版本兼容的 Microsoft C/C++ 编译器和 Windows SDK。如果缺少编译器工具或 SDK 头文件,pip install、python setup.py build 或 conda build 可能会失败,并出现如下错误。
Unable to find vcvarsall.bat
这通常意味着 Python 的构建工具找不到 Visual C++ 构建环境脚本。
我安装了 Visual C++ 2017 后,这个错误就消失了。
更稳妥的修复方式,是安装与 Python 版本匹配的 Microsoft C++ 构建工具。在 Visual Studio 安装器中,确保选中了 C++ 工作负载,包括 MSVC 编译器和 Windows SDK。
安装完成后,打开一个新的终端并确认编译器可用:
where cl
cl
如果仍然找不到 cl,请启动 Visual Studio Developer Command Prompt,或者在构建前运行相应的 vcvarsall.bat 脚本。
Cannot open include file: 'io.h'
另一个可能出现的错误是:
c:miniconda3includepyconfig.h(59): fatal error C1083: Cannot open include file: 'io.h': No such file or directory
头文件 io.h 来自 Windows SDK / Universal CRT 头文件。这个错误通常意味着 SDK 头文件没有安装,或当前编译器环境无法找到它们。
安装 Windows 10 SDK 可以解决这个问题,不过当时我还没有亲自尝试。
一个实用的检查清单如下:
- 打开 Visual Studio Installer。
- 修改已安装的 Build Tools 或 Visual Studio 安装项。
- 启用 C++ 构建工具工作负载。
- 确保选中了一个已安装的 Windows SDK。
- 重启终端并重新构建扩展。
然后再次尝试构建:
python -m pip install .
或者,对于旧式项目:
python setup.py build
如果项目使用 Conda,也要确认当前激活的环境就是你打算用于构建的环境:
where python
python -c "import sys; print(sys.executable); print(sys.version)"
关键在于,Python、MSVC 编译器和 Windows SDK 必须在同一个 shell 会话中都可见。
