windows平台使用Microsoft Visual C++ Compiler for Python 2.7编译python扩展

windows平台使用Microsoft Visual C++ Compiler for Python 2.7编译python扩展


在windows平台上安装python c extension的扩展包是件很痛苦的事情,一般通过安装vc/vs系列来编译C扩展,不过安装包都比较大。或者通过mingw编译,不过有时会在兼容性上出现点问题。

有个好消息就是微软为Python提供了专用的编译器Microsoft Visual C++ Compiler for Python 2.7(包含32位和64位) 下载地址: http://aka.ms/vcpython27(这个貌似是进入官网了,然后搜索即可找到)

提示:在此感谢@ThunderEX的提醒,setuptools 6.0及后续版本可以自动识别Microsoft Visual C++ Compiler for Python 2.7了,赶紧升级吧。如果不能升级,请参考下面的操作步骤。

1.下载完成并安装。以本机为例,安装完成后的路径为: 

1
C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C + +  for  Python\ 9.0

2.修改python安装目录下Lib\distutils\msvc9compiler.py文件(如有必要可能msvccompiler.py文件也需要做相应更改,视系统而定),找到get_build_version方法直接return 9.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def  get_build_version():
     """Return the version of MSVC that was used to build Python.
 
     For Python 2.3 and up, the version number is included in
     sys.version.  For earlier versions, assume the compiler is MSVC 6.
     """
     return  9.0
     prefix  =  "MSC v."
     =  sys.version.find(prefix)
     if  = =  - 1 :
         return  6
     =  +  len (prefix)
     s, rest  =  sys.version[i:].split( " " 1 )
     majorVersion  =  int (s[: - 2 ])  -  6
     minorVersion  =  int (s[ 2 : 3 ])  /  10.0
     # I don't think paths are affected by minor version in version 6
     if  majorVersion  = =  6 :
         minorVersion  =  0
     if  majorVersion > =  6 :
         return  majorVersion  +  minorVersion
     # else we don't know what version of the compiler this is
     return  None

然后再找到find_vcvarsall方法直接返回vcvarsall.bat的路径(以自己机器安装后的路径为准)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def  find_vcvarsall(version):
     """Find the vcvarsall.bat file
 
     At first it tries to find the productdir of VS 2008 in the registry. If
     that fails it falls back to the VS90COMNTOOLS env var.
     """
     return  r 'C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat'
     vsbase  =  VS_BASE  %  version
     try :
         productdir  =  Reg.get_value(r "%s\Setup\VC"  %  vsbase,
                                    "productdir" )
     except  KeyError:
         productdir  =  None
 
     # trying Express edition
     if  productdir  is  None :
         vsbase  =  VSEXPRESS_BASE  %  version
         try :
             productdir  =  Reg.get_value(r "%s\Setup\VC"  %  vsbase,
                                        "productdir" )
         except  KeyError:
             productdir  =  None
             log.debug( "Unable to find productdir in registry" )
 
     if  not  productdir  or  not  os.path.isdir(productdir):
         toolskey  =  "VS%0.f0COMNTOOLS"  %  version
         toolsdir  =  os.environ.get(toolskey,  None )
 
         if  toolsdir  and  os.path.isdir(toolsdir):
             productdir  =  os.path.join(toolsdir, os.pardir, os.pardir,  "VC" )
             productdir  =  os.path.abspath(productdir)
             if  not  os.path.isdir(productdir):
                 log.debug( "%s is not a valid directory"  %  productdir)
                 return  None
         else :
             log.debug( "Env var %s is not set or invalid"  %  toolskey)
     if  not  productdir:
         log.debug( "No productdir found" )
         return  None
     vcvarsall  =  os.path.join(productdir,  "vcvarsall.bat" )
     if  os.path.isfile(vcvarsall):
         return  vcvarsall
     log.debug( "Unable to find vcvarsall.bat" )
     return  None

3.上述完成之后就可以在windwos下正常编译python的C扩展。以pycrypto-2.6.1为例,执行如下命令

1
python setup.py install

当然也可以建立一个windows的二进制包

1
python setup.py bdist_wininst

猜你喜欢

转载自blog.csdn.net/lushilun/article/details/78621199