中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-11 20:52:41 來源:ITPUB博客 閱讀:195 作者:studywell 欄目:編程語言

轉: https://www.cnblogs.com/yyds/p/7065637.html


本文內容


  1. Unable to find vcvarsall.bat的問題描述

  2. 問題分析

  3. 總結

提示:  如果你只是想知道自己需要安裝哪個版本的Visual Studio請直接查看本文最后一個小節的內容。

一、問題描述


我們在windows下通過pip安裝一些外部Python 模塊(比如,pycrypto)時通常會遇到安裝失敗的問題,而且會看到類似這樣的錯誤提示:

error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27

如圖所示:
Windows下安裝Python擴展模塊提示“Unable to find vcvarsall.bat”的問題

error: Unable to find vcvarsall.bat

如圖所示:
Windows下安裝Python擴展模塊提示“Unable to find vcvarsall.bat”的問題

網上的很多文章給出的解決方案都安裝Visual Studio,但是版本是有要求的,有的說安裝Visual Studio 2008,有的說要安裝Visual Studio 2010。 那么為什么安裝Visual Studio就能解決這個問題呢?到底該安裝哪個版本的VisualStudio呢?是否有其他解決方案呢?  這些問題是本文討論的重點,希望大家以后遇到這些問題不再有那么多的困惑和慌亂感。

二、問題分析


1. 名詞解釋

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

  • 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及內部版本的對應關系如下:
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。  如下圖所示:

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

“MSC V.”后面那個數字1500就是編譯當前Python所使用的VC的版本信息,但還不是我們要找的那個內部版本號,我們要從這個版本信息中找到主版本號majorVersion和次版本號minorVersion, majorVersion + minorVersion 的結果才是我們要找那個內部版本號。那么這里的majorVersion和minorVersion怎么獲取到呢?我們可以從上面的get_build_version()函數中找到答案:

majorVersion = int(s[:-2]) - 6minorVersion = 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平臺吧!

三、總結


  • 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的下載地址在 這里 。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德州市| 江阴市| 新丰县| 论坛| 务川| 扶绥县| 鄂伦春自治旗| 荥阳市| 灵石县| 仁化县| 化德县| 柳州市| 察哈| 农安县| 保靖县| 忻州市| 澄城县| 巴彦县| 胶州市| 聂荣县| 秀山| 克东县| 依安县| 东辽县| 中超| 吴旗县| 沅江市| 沂南县| 鞍山市| 阜宁县| 都安| 平远县| 高平市| 静乐县| 资中县| 凤阳县| 赤城县| 万源市| 霍州市| 肥西县| 博罗县|