溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-08-11 20:52:41 來(lái)源:ITPUB博客 閱讀:194 作者:studywell 欄目:編程語(yǔ)言

轉(zhuǎn): https://www.cnblogs.com/yyds/p/7065637.html


本文內(nèi)容


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

  2. 問題分析

  3. 總結(jié)

提示:  如果你只是想知道自己需要安裝哪個(gè)版本的Visual Studio請(qǐng)直接查看本文最后一個(gè)小節(jié)的內(nèi)容。

一、問題描述


我們?cè)趙indows下通過pip安裝一些外部Python 模塊(比如,pycrypto)時(shí)通常會(huì)遇到安裝失敗的問題,而且會(huì)看到類似這樣的錯(cuò)誤提示:

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

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

error: Unable to find vcvarsall.bat

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

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

二、問題分析


1. 名詞解釋

我們先對(duì)上面錯(cuò)誤信息中幾個(gè)名詞做個(gè)簡(jiǎn)單的介紹:

  • Microsoft Visual C++ :  簡(jiǎn)稱Visual C++、MSVC、VC++或VC,它是微軟公司開發(fā)的Windows平臺(tái)下的C++開發(fā)工具,具有集成開發(fā)環(huán)境,可以用來(lái)編輯和編譯C、C++以及C++/CLI等編程語(yǔ)言。

  • Microsoft Visual Studio :  簡(jiǎn)稱VS,它是美國(guó)微軟公司的開發(fā)工具包系列產(chǎn)品,它是一個(gè)基本完整的開發(fā)工具集,包含了整個(gè)軟件生命周期中所需要的大部分工具,如UML工具,代碼管控工具,也包括上面這個(gè)集成開發(fā)環(huán)境Microsoft Visual C++。

  • 內(nèi)部版本號(hào):  由上可見VS是包含VC的,另外它們之間版本是有對(duì)應(yīng)關(guān)系的,這個(gè)對(duì)應(yīng)關(guān)系是由微軟的內(nèi)部版本來(lái)控制的,上面的報(bào)錯(cuò)信息 "Microsoft Visual C++ 9.0" 中的 9.0就是Microsoft Visual C++的一個(gè)內(nèi)部版本。我們可以根據(jù)這個(gè)內(nèi)部版本找到對(duì)應(yīng)的VC版本是什么,以及對(duì)應(yīng)的VS版本是什么。

VS與VC及內(nèi)部版本的對(duì)應(yīng)關(guān)系如下:
VS名稱 內(nèi)部版本 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. 問題分析

了解了上面這些名詞以及它們之間關(guān)系的之后,我們來(lái)分析一下本文第一部分中的錯(cuò)誤信息:

  • 1)從上面的報(bào)錯(cuò)信息來(lái)看,是因?yàn)檎也坏絭cvarsall.bat這個(gè)批處理文件引起的問題。

  • 2)其中有一張截圖中提示:Microsoft Visual C++ 9.0 is required,說(shuō)明根本原因是由于沒有安裝Microsoft Visual C++,且要求的內(nèi)部版本是 9.0。

3. 答疑解惑

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

問題1:為什么安裝python擴(kuò)展模塊需要安裝Microsoft Visual C++呢?

因?yàn)橛行┡c操作系統(tǒng)底層密切相關(guān)的Python擴(kuò)展,由于使用C/C++ 進(jìn)行代碼編寫,因此在進(jìn)行安裝時(shí)需要進(jìn)行C/C++ 代碼的編譯工作,而Windows平臺(tái)的專用C/C++ 代碼編譯工具就是Microsoft Visual C++ ,因此Python的模塊管理工具(如,pip)默認(rèn)設(shè)置的用來(lái)編譯C/C++ 代碼的工具就是VC。Linux平臺(tái)上所使用的C/C++ 代碼編譯工具通常都是gcc,因此不涉及安裝VS的問題。

問題2:為什么安裝Visual Studio可以解決這個(gè)問題?

上面已經(jīng)說(shuō)明過了,因?yàn)閂isual Studio中包含Visual C++,安裝了Visual Studio之后也就安裝了Visual C++。

問題3:為什么有時(shí)候安裝Visual Studio最新版本都無(wú)法解決這個(gè)問題?

因?yàn)槲覀儺?dāng)前大部分使用的是CPython,也就是C語(yǔ)言實(shí)現(xiàn)的Python版本,我們?cè)赪indows上安裝的Python也是經(jīng)過VC編譯過的可執(zhí)行程序。為了保證擴(kuò)展模塊的兼容性,使用Python的模塊管理工具(如,pip)安裝C語(yǔ)言實(shí)現(xiàn)的外部擴(kuò)展模塊時(shí)會(huì)默認(rèn)查找并使用與編譯當(dāng)前Python時(shí)所使用的相同內(nèi)部版本或相互兼容的內(nèi)部版本的的VC,而VS的內(nèi)部版本與其所包含的VC的內(nèi)部版本是一致的,因此安裝的VS版本過高或過低都可能會(huì)出現(xiàn)問題。

問題4:如何確定需要安裝哪個(gè)版本的Visual Studio呢?

其實(shí)這個(gè)問題的本質(zhì)就是確定需要安裝的VS或VC的內(nèi)部版本。

本文開始列出的報(bào)錯(cuò)信息中,有一個(gè)是明確給出了所需要的VC的內(nèi)部版本的,比如

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

說(shuō)明需要安裝的VC內(nèi)部版本號(hào)是 9.0,從上面的版本對(duì)應(yīng)表中可以找到,我們需要安裝的VS版本是 Visual Studio 2008。

但是對(duì)于那些沒有明確提示所需要的內(nèi)部版本號(hào)的情況,我們?cè)趺创_定需要安裝哪個(gè)版本的VC/VS呢?比如

error: Unable to find vcvarsall.bat

我當(dāng)前的操作系統(tǒng)是Win 10,我安裝Python的目錄是C://Python27,在Python的安裝目錄下可以找到這樣一個(gè)Python文件: C://Python27/Lib/distutils/msvccompiler.py ,從文件名就能看出來(lái)這個(gè)Python文件就是用來(lái)處理與VC編譯器有關(guān)的操作的。在該P(yáng)ython文件中可以找到這樣一個(gè)函數(shù):

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

通過注釋我們可以知道,這個(gè)函數(shù)就是用來(lái)確定編譯當(dāng)前Python所使用的VC編譯器的版本號(hào)的,而且注釋中告知 從Python 2.3版本開始,VC的版本信息已經(jīng)包含在sys.version中了,對(duì)于Python 2.3之前的版本就認(rèn)為VC版本號(hào)是6。  如下圖所示:

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

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

majorVersion = int(s[:-2]) - 6minorVersion = int(s[2:3]) / 10.0

上面代碼中的s就是'MSC v.'后面那個(gè)數(shù)字1500,可見:

  • 前兩位數(shù)減去6就是主版本號(hào),即majorVersion = 15 - 6 = 9

  • 后面兩位數(shù)除以10.0就是此版本號(hào),即00 / 10.0 = 0.0

  • 所以我們可以得到我們要找的那個(gè)內(nèi)部版本號(hào):majorVersion + minorVersion = 9 + 0.0 = 9.0。

  • 從上面那個(gè)版本對(duì)應(yīng)表中可以查到 內(nèi)部版本號(hào)9.0對(duì)應(yīng)的VC和VS名稱分別是:Visual C++ 2008 和 Visual Studio 2008。

如果你沒看明白,可以直接看本文最后的總結(jié),會(huì)列出不同版本的Python對(duì)應(yīng)的內(nèi)部版本號(hào)以及它們與VC和VS的對(duì)應(yīng)關(guān)系。

問題5:是否可以只安裝VC,不安裝VS呢?

可以,請(qǐng) 點(diǎn)擊這里 查看詳細(xì)說(shuō)明。

問題6:是否有其他解決方案?

有的,其實(shí)我們的目就是在當(dāng)前Windows系統(tǒng)上安裝一個(gè)與編譯當(dāng)前Python時(shí)所使用的VC版本一致的編譯器,而微軟專門為Python提供了相應(yīng)的編譯器: Microsoft Visual C++ Compiler for Python 2.7 ,我們直接安裝這個(gè)軟件程序就可以了。 遺憾的是,目前還沒有找到Microsoft Visual C++ Compiler for Python 3.x ,所以對(duì)于Python 3.x,我們還是需要安裝Visual Studio 或 Visual C++?;蛘?,拋棄Windows平臺(tái)吧!

三、總結(jié)


  • 1)如果當(dāng)前使用的是Python 2.7,可以安裝Visual Studio 2008,也可以安裝 Microsoft Visual C++ Compiler for Python 2.7來(lái)解決這個(gè)問題;

  • 2)如果當(dāng)前當(dāng)前使用的Python 3.x,只能通過安裝相應(yīng)版本的Visual Studio或Visual C++來(lái)解決這個(gè)問題。

當(dāng)然網(wǎng)上還有一些其他的解決方案,比如修改上面提到的get_build_version()函數(shù),在函數(shù)的開始部分給version變量重新賦值來(lái)兼容Visual Studio的高版本;再比如,通過安裝MinGW并修改Python擴(kuò)展包管理程序的配置文件,將編譯器改為mingw等。這些方案?jìng)€(gè)人不提倡使用,因?yàn)榭赡軙?huì)帶來(lái)一些其他不可預(yù)知的問題。

當(dāng)前主流Python版本與VC和VS的版本對(duì)應(yīng)關(guān)系及各版本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問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI