在 Windows 上编译 Python 的 C 扩展

在 Windows 上编译 Python 的 C 扩展

在 Windows 上编译 Python C 扩展时,构建过程必须使用与当前 Python 版本兼容的 Microsoft C/C++ 编译器和 Windows SDK。如果缺少编译器工具或 SDK 头文件,pip installpython setup.py buildconda 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 可以解决这个问题,不过当时我还没有亲自尝试。

一个实用的检查清单如下:

  1. 打开 Visual Studio Installer。
  2. 修改已安装的 Build Tools 或 Visual Studio 安装项。
  3. 启用 C++ 构建工具工作负载。
  4. 确保选中了一个已安装的 Windows SDK。
  5. 重启终端并重新构建扩展。

然后再次尝试构建:

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 会话中都可见。

Leave a Reply