解決使用 Python Tools for Visual Studio 時編譯套件的問題

透過 Python Tools for Visual Studio (PTVS) 這個免費且開源的工具(免費的 Visual Studio Community 版就可以安裝,而且 2015 還直接成為安裝時可以勾選的選擇性安裝項目),就可以用 Visual Studio 做為開發 Python 相關應用程式的 IDE(當然,你得先到 Python 官網上下載 Windows 版的 Python 程式),而且還支援像是 Django, Flask 這些開發框架的開發工作,與 Microsoft Azure 的結合也很容易,甚至還能開發 Windows IoT 相關的專案。

而透過 PTVS 的 Python 方案,也可以有 GUI 整合的建立 Virtual Environment:

以及 pipeasy_install 等套件安裝工具:

問題

不過如果安裝到需要使用 C++ 編譯器來編譯的套件(如:NumPy 等),會發現它找不到 Microsoft Visual C++ 10.0 編譯器的錯誤訊息(訊息中會說找不到 vcvarsall.bat 這個設定環境的批次指令檔),這是因為在 Windows 版的 Python 中(2.7 及 3.4 都是)的 distutils 中目前是寫死使用 msvc9compiler,也就是 Visual C++ 2008 所附的 C++ 編譯器。

解決方法

當然一個選擇是去修改 C:\Python27\Lib\distutils\msvccompiler.py 這個檔案來讓它改用新版的 Visual Studio 中的 C++ 編譯器來進行編譯,但一個最簡單的作法就是下載 Microsoft Visual C++ Compiler for Python 2.7 (其實 Python 3.4 也適用),它就會在 %USERPROFILE%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0 目錄(如果你的登入帳號是 xyz,通常 %USERPROFILE% 就是 C:\Users\xyz)下裝一個 Visual C++ 10.0 的版本。不過這樣還不夠,要加入一個 VS90COMNTOOLS 的環境變數,讓它的值指到  %USERPROFILE%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0

這樣一來,當你再次使用 pip 或 easy_install 安裝需要用 C++ 編譯的套件時就可以順利編譯了。

順帶一提

目前我在編譯 NumPy 這個套件時會產生 RuntimeError: Broken toolchain: cannot link a simple C program 的錯誤訊息,在網路上找到的普遍解法都是修改 C++ 編譯器的參數,不過也可以直接修改 C:\Python27\Lib\distutils\msvc9compiler.py 檔案中,找到下面這段:

 # implies a build environment error that shouldn't go undetected.
#mfinfo = self.manifest_get_embed_info(target_desc, ld_args)
mfinfo = None
if mfinfo is not None:
    mffilename, mfid = mfinfo

把原本的 mfinfo = self.... 這段註解起來,然後改成 mfinfo = None 即可。