在windows平台上安装python c extension的扩展包是件很痛苦的事情,通常经过安装vc/vs系列来编译C扩展,不过安装包都比较大。或者经过mingw编译,不过有时会在兼容性上出现点问题。python
有个好消息就是微软为Python提供了专用的编译器Microsoft Visual C++ Compiler for Python 2.7(包含32位和64位) 下载地址: http://aka.ms/vcpython27windows
提示:在此感谢@ThunderEX的提醒,setuptools 6.0及后续版本能够自动识别Microsoft Visual C++ Compiler for Python 2.7了,赶忙升级吧。若是不能升级,请参考下面的操做步骤。ui
1.下载完成并安装。以本机为例,安装完成后的路径为: this
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.0spa
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." i = sys.version.find(prefix) if i == -1: return 6 i = i + 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的路径(以本身机器安装后的路径为准)debug
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为例,执行以下命令rest
python setup.py install
固然也能够创建一个windows的二进制包blog
python setup.py bdist_wininst