You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为setup.py编译指定特定版本的C编译器?

如何让setup.py使用指定版本的MSVC编译器?

当前在Azure的GitHub Runner Windows机器上,distutils默认使用14.35.32215版本的MSVC编译器和链接器:

>>> import distutils.ccompiler as cc
>>> compiler = cc.new_compiler()
>>> compiler.initialize()
>>> compiler.cc
'C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Tools\\MSVC\\14.35.32215\\bin\\HostX86\\x64\\cl.exe'
>>> compiler.linker
'C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Tools\\MSVC\\14.35.32215\\bin\\HostX86\\x64\\link.exe'

机器上还安装了多个MSVC版本:

C:\Users\fyellin>dir "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\"
 Volume in drive C is Windows
...
12/20/2023  08:29 AM    <DIR>          .
10/10/2023  10:41 PM    <DIR>          ..
10/10/2023  11:04 PM    <DIR>          14.16.27023
10/10/2023  11:05 PM    <DIR>          14.29.30133
10/10/2023  10:47 PM    <DIR>          14.35.32215
10/10/2023  11:09 PM    <DIR>          14.37.32822

核心问题

  • 能否通过设置环境变量、运行Python前执行命令或修改setup.py代码,让setup.py使用其他版本的C编译器?
  • distutils是如何找到MSVC目录并选择14.35.32215版本的?这个版本号的来源是什么?

解决方法

1. 运行Python前执行VS开发人员命令行工具(推荐)

每个MSVC版本都对应一套独立的环境变量配置,通过运行对应版本的vcvarsall.bat可直接切换编译器环境:

  • 例如要使用14.37.32822版本,在命令行执行:
"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.37

执行完成后再运行python setup.py build,distutils会自动使用当前环境变量指向的编译器版本。

2. 设置环境变量

手动指定DISTUTILS_USE_SDK、VCINSTALLDIR和SDK_VERSION三个环境变量:

set DISTUTILS_USE_SDK=1
set VCINSTALLDIR=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.37.32822
set SDK_VERSION=10.0.22621.0  # 替换为机器上已安装的Windows SDK版本

设置完成后直接运行python setup.py build即可生效。

3. 修改setup.py代码

在setup.py开头添加代码,重写编译器路径的查找逻辑:

import distutils.msvccompiler

# 替换为目标MSVC版本号
target_version = "14.37.32822"
vc_install_dir = f"C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Tools\\MSVC\\{target_version}"

def custom_find_vcvarsall(version):
    return f"{vc_install_dir}\\Auxiliary\\Build\\vcvarsall.bat"

# 覆盖默认查找函数
distutils.msvccompiler.find_vcvarsall = custom_find_vcvarsall

之后正常执行python setup.py build即可使用指定版本编译器。


版本选择逻辑说明

distutils选择MSVC版本的核心逻辑如下:

  1. 优先读取环境变量:如果已设置VCINSTALLDIR和SDK_VERSION,直接使用对应版本。
  2. 自动查找VS版本:无环境变量时,调用VS自带的vswhere.exe工具扫描已安装的VS实例,默认选择与当前Python版本兼容的最高稳定版(例如CPython 3.11及以上要求MSVC 14.29+)。
  3. 14.35.32215被选中,大概率是因为它是当前环境中被标记为Python兼容的默认优先级版本,或是vswhere.exe返回的最高可用兼容版本。

内容的提问来源于stack exchange,提问作者Frank Yellin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:06:34