Windows安裝Python模塊提示「Unable to find vcvarsall.bat」

原文連接html

Windows下安裝Python擴展模塊提示「Unable to find vcvarsall.bat」的問題python

本文內容

  1. Unable to find vcvarsall.bat的問題描述
  2. 問題分析
  3. 總結

提示: 若是你只是想知道本身須要安裝哪一個版本的Visual Studio請直接查看本文最後一個小節的內容。編程

1、問題描述

咱們在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呢?是否有其餘解決方案呢? 這些問題是本文討論的重點,但願你們之後遇到這些問題再也不有那麼多的困惑和慌亂感。開發工具

2、問題分析

1. 名詞解釋

咱們先對上面錯誤信息中幾個名詞作個簡單的介紹:ui

  • Microsoft Visual C++ : 簡稱Visual C++、MSVC、VC++或VC,它是微軟公司開發的Windows平臺下的C++開發工具,具備集成開發環境,能夠用來編輯和編譯C、C++以及C++/CLI等編程語言。
  • Microsoft Visual Studio : 簡稱VS,它是美國微軟公司的開發工具包系列產品,它是一個基本完整的開發工具集,包含了整個軟件生命週期中所須要的大部分工具,如UML工具,代碼管控工具,也包括上面這個集成開發環境Microsoft Visual C++。
  • 內部版本號: 由上可見VS是包含VC的,另外它們之間版本是有對應關係的,這個對應關係是由微軟的內部版原本控制的,上面的報錯信息 "Microsoft Visual C++ 9.0" 中的 9.0就是Microsoft Visual C++的一個內部版本。咱們能夠根據這個內部版本找到對應的VC版本是什麼,以及對應的VS版本是什麼。

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

2. 問題分析

瞭解了上面這些名詞以及它們之間關係的以後,咱們來分析一下本文第一部分中的錯誤信息:

  • 1)從上面的報錯信息來看,是由於找不到vcvarsall.bat這個批處理文件引發的問題。
  • 2)其中有一張截圖中提示:Microsoft Visual C++ 9.0 is required,說明根本緣由是因爲沒有安裝Microsoft Visual C++,且要求的內部版本是 9.0。

3. 答疑解惑

咱們內心可能有一些疑惑,看看下面有沒有你要找的答案:

問題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,可見:

  • 前兩位數減去6就是主版本號,即majorVersion = 15 - 6 = 9
  • 後面兩位數除以10.0就是此版本號,即00 / 10.0 = 0.0
  • 因此咱們能夠獲得咱們要找的那個內部版本號:majorVersion + minorVersion = 9 + 0.0 = 9.0。
  • 從上面那個版本對應表中能夠查到 內部版本號9.0對應的VC和VS名稱分別是:Visual C++ 2008 和 Visual Studio 2008。

若是你沒看明白,能夠直接看本文最後的總結,會列出不一樣版本的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平臺吧!

3、總結

  • 1)若是當前使用的是Python 2.7,能夠安裝Visual Studio 2008,也能夠安裝 Microsoft Visual C++ Compiler for Python 2.7來解決這個問題;
  • 2)若是當前當前使用的Python 3.x,只能經過安裝相應版本的Visual Studio或Visual C++來解決這個問題。

固然網上還有一些其餘的解決方案,好比修改上面提到的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的下載地址在這裏

相關文章
相關標籤/搜索