在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