原文連接html
Windows下安裝Python擴展模塊提示「Unable to find vcvarsall.bat」的問題python
提示: 若是你只是想知道本身須要安裝哪一個版本的Visual Studio請直接查看本文最後一個小節的內容。編程
咱們在windows下經過pip安裝一些外部Python 模塊(好比,pycrypto)時一般會遇到安裝失敗的問題,並且會看到相似這樣的錯誤提示:windows
error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
如圖所示:
編程語言
或函數
error: Unable to find vcvarsall.bat
如圖所示:
工具
網上的不少文章給出的解決方案都安裝Visual Studio,可是版本是有要求的,有的說安裝Visual Studio 2008,有的說要安裝Visual Studio 2010。那麼爲何安裝Visual Studio就能解決這個問題呢?到底該安裝哪一個版本的VisualStudio呢?是否有其餘解決方案呢? 這些問題是本文討論的重點,但願你們之後遇到這些問題再也不有那麼多的困惑和慌亂感。開發工具
咱們先對上面錯誤信息中幾個名詞作個簡單的介紹:ui
VS與VC及內部版本的對應關係以下:this
VS名稱 | 內部版本 | VC名稱 |
---|---|---|
Visual Studio | 4.0 | Visual C++ 4.0 |
Visual Studio 97 | 5.0 | Visual C++ 5.0 |
Visual Studio 6.0 | 6.0 | Visual C++ 6.0 |
Visual Studio .NET 2002 | 7.0 | Visual C++ 2002 |
Visual Studio .NET 2003 | 7.1 | Visual C++ 2003 |
Visual Studio 2005 | 8.0 | Visual C++ 2005 |
Visual Studio 2008 | 9.0 | Visual C++ 2008 |
Visual Studio 2010 | 10.0 | Visual C++ 2010 |
Visual Studio 2012 | 11.0 | Visual C++ 2012 |
Visual Studio 2013 | 12.0 | Visual C++ 2013 |
Visual Studio 2015 | 14.0 | Visual C++ 2015 |
Visual Studio 2015 RTM | 14.0 | Visual C++ 2015 |
瞭解了上面這些名詞以及它們之間關係的以後,咱們來分析一下本文第一部分中的錯誤信息:
咱們內心可能有一些疑惑,看看下面有沒有你要找的答案:
問題1:爲何安裝python擴展模塊須要安裝Microsoft Visual C++呢?
由於有些與操做系統底層密切相關的Python擴展,因爲使用C/C++ 進行代碼編寫,所以在進行安裝時須要進行C/C++ 代碼的編譯工做,而Windows平臺的專用C/C++ 代碼編譯工具就是Microsoft Visual C++ ,所以Python的模塊管理工具(如,pip)默認設置的用來編譯C/C++ 代碼的工具就是VC。Linux平臺上所使用的C/C++ 代碼編譯工具一般都是gcc,所以不涉及安裝VS的問題。
問題2:爲何安裝Visual Studio能夠解決這個問題?
上面已經說明過了,由於Visual Studio中包含Visual C++,安裝了Visual Studio以後也就安裝了Visual C++。
問題3:爲何有時候安裝Visual Studio最新版本都沒法解決這個問題?
由於咱們當前大部分使用的是CPython,也就是C語言實現的Python版本,咱們在Windows上安裝的Python也是通過VC編譯過的可執行程序。爲了保證擴展模塊的兼容性,使用Python的模塊管理工具(如,pip)安裝C語言實現的外部擴展模塊時會默認查找並使用與編譯當前Python時所使用的相同內部版本或相互兼容的內部版本的的VC,而VS的內部版本與其所包含的VC的內部版本是一致的,所以安裝的VS版本太高或太低均可能會出現問題。
問題4:如何肯定須要安裝哪一個版本的Visual Studio呢?
其實這個問題的本質就是肯定須要安裝的VS或VC的內部版本。
本文開始列出的報錯信息中,有一個是明確給出了所須要的VC的內部版本的,好比
error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
說明須要安裝的VC內部版本號是 9.0,從上面的版本對應表中能夠找到,咱們須要安裝的VS版本是 Visual Studio 2008。
可是對於那些沒有明確提示所須要的內部版本號的狀況,咱們怎麼肯定須要安裝哪一個版本的VC/VS呢?好比
error: Unable to find vcvarsall.bat
我當前的操做系統是Win 10,我安裝Python的目錄是C://Python27,在Python的安裝目錄下能夠找到這樣一個Python文件:C://Python27/Lib/distutils/msvccompiler.py
,從文件名就能看出來這個Python文件就是用來處理與VC編譯器有關的操做的。在該Python文件中能夠找到這樣一個函數:
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. """ prefix = "MSC v." i = string.find(sys.version, 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
經過註釋咱們能夠知道,這個函數就是用來肯定編譯當前Python所使用的VC編譯器的版本號的,並且註釋中告知從Python 2.3版本開始,VC的版本信息已經包含在sys.version中了,對於Python 2.3以前的版本就認爲VC版本號是6。 以下圖所示:
「MSC V.」後面那個數字1500就是編譯當前Python所使用的VC的版本信息,但還不是咱們要找的那個內部版本號,咱們要從這個版本信息中找到主版本號majorVersion和次版本號minorVersion,majorVersion + minorVersion
的結果纔是咱們要找那個內部版本號。那麼這裏的majorVersion和minorVersion怎麼獲取到呢?咱們能夠從上面的get_build_version()函數中找到答案:
majorVersion = int(s[:-2]) - 6 minorVersion = int(s[2:3]) / 10.0
上面代碼中的s就是'MSC v.'後面那個數字1500,可見:
若是你沒看明白,能夠直接看本文最後的總結,會列出不一樣版本的Python對應的內部版本號以及它們與VC和VS的對應關係。
問題5:是否能夠只安裝VC,不安裝VS呢?
能夠,請點擊這裏查看詳細說明。
問題6:是否有其餘解決方案?
有的,其實咱們的目就是在當前Windows系統上安裝一個與編譯當前Python時所使用的VC版本一致的編譯器,而微軟專門爲Python提供了相應的編譯器:Microsoft Visual C++ Compiler for Python 2.7,咱們直接安裝這個軟件程序就能夠了。遺憾的是,目前尚未找到Microsoft Visual C++ Compiler for Python 3.x,因此對於Python 3.x,咱們仍是須要安裝Visual Studio 或 Visual C++。或者,拋棄Windows平臺吧!
固然網上還有一些其餘的解決方案,好比修改上面提到的get_build_version()函數,在函數的開始部分給version變量從新賦值來兼容Visual Studio的高版本;再好比,經過安裝MinGW並修改Python擴展包管理程序的配置文件,將編譯器改成mingw等。這些方案我的不提倡使用,由於可能會帶來一些其餘不可預知的問題。
當前主流Python版本與VC和VS的版本對應關係及各版本VS下載地址:
CPython | Visual C++ | Visual Studio | Visual Studio下載地址 |
---|---|---|---|
2.6, 2.7, 3.0, 3.1, 3.2 | 9.0 | Visual Studio 2008 | x86下載 x64下載 |
3.3, 3.4 | 10.0 | Visual Studio 2010 | x86下載 x64下載 |
3.5 | 14.0 | Visual Studio 2015 | 下載 |
Microsoft Visual C++ Compiler for Python 2.7的下載地址在這裏。