在用C给python3.写扩展时遇到如下问题:
写好
*
module.c和setup.py文件后执行
python setup.py build
报unable to find vcvarsall.bat
我机器上有vs2005和vc6,但是还是报错。
搜索很多资料:
网上提供解决办法如下:
下载mingw环境,添加环境变量
使用
python setup.py build –compiler
=
mingw32
这个办法感觉只是绕过了这个问题,并不是真正解决问题,而且我系统中python是用vs编译的,扩展模块却用mingw
-
gcc编译,感觉可能有问题。
但网上对此就缺少详细的说明
经过对C:
/
Python32
/
Lib
/
distutils目录下.py文件的仔细翻阅,发现“unable to find vcvarsall.bat”这句话出在msvc9compiler.py中
再研究这个文件发现问题所在了:
它是在注册表中寻找到vs的目录,再去在vs目录下找vcvarsall.bat。
但是问题就出在python32里面默认是vc9.
0
也就是vs2008所以它在注册表里面找不到键值返回
None
productdir
=
Reg.get_value(r
"%s/Setup/VC"
%
vsbase,
"productdir"
)
vsbase值为:Software
/
Microsoft
/
VisualStudio
/
9.0
具体修改代码如下:
msvc9compiler.py中
def
find_vcvarsall(version) 用于查找vcvarsall.bat version就是版本号,实际上是
9.0
vc_env
=
query_vcvarsall(VERSION, plat_spec)
VERSION
=
get_build_version() 因为python32自己是由vc9.
0
构建的所以VERSION是
9.0
修改MSVCCompiler函数:
vc_env
=
query_vcvarsall(VERSION, plat_spec)
为:
vc_env
=
query_vcvarsall(11
.0
, plat_spec) #这是因为我使用的是vs2012,如果你使用的是其他版本使用相同的版本即可
不过还有这句话:
if
VERSION <
8.0
:
raise
DistutilsPlatformError(
"VC %0.1f is not supported by this module"
%
VERSION)
看来,python3.
2
中的distutils只支持vc8.
0
以上,即vs2005以上的编译器。