遇到问题: Windows下安装Python扩展模块, 提示“Unable to find vcvarsall.bat”的问题

2023-11-07

全程参考:  https://www.cnblogs.com/yyds/p/7065637.html   写得很好,不知道能不能解决我的问题!!!

尝试解决办法:安装visual studio 2015, 原因请看下面。

1 为什么遇到这个问题:

1 在安装商汤出的PYSOT过程中遇到问题:
github程序PySOT(商汤推出的siam各种跟踪算法包)
我自己的博客 https://blog.csdn.net/zjc910997316/article/details/90749847

2 其中有个python扩展模块,里面用到了c语言的程序

报错如下:找不到 vcvarsall.bat

报错位置的文件
果然是 region.c文件
因此需要安装 Microsoft Visual C++ 或者 Visual Studio

 

2 为什么要安装 Microsoft Visual C++ 或者 Visual Studio:

问题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版本过高或过低都可能会出现问题

3 什么是VS、什么是VC,以及它们对应关系:

 

4 如何确定需要安装哪个版本的Visual Studio呢?

环境1:如果  win10 + python27如下:
操作系统是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

上面代码中的 就是 '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。

环境2(ps:我的环境):如果 像我一样 win7 + 我安装的是anaonda (python37)如下:

在该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 = sys.version.find(prefix)
    if i == -1:
        return 6
    i = i + len(prefix)
    s, rest = sys.version[i:].split(" ", 1)
    majorVersion = int(s[:-2]) - 6
    if majorVersion >= 13:
        # v13 was skipped and should be v14
        majorVersion += 1
    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

查看我的
VC的版本信息已经包含在sys.version中了
pyhton ->import sys -> sys.version

“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

上面代码中的 就是 'MSC v.'
后面那个数字1915 1500,可见:

  • 前两位数减去6就是主版本号,即majorVersion = 19 - 6 = 13
  • 后面两位数除以10.0就是此版本号,即15 / 10.0 = 1.5
  • 所以我们可以得到我们要找的那个内部版本号:majorVersion + minorVersion = 13 + 1.5 = 14.5。
  • 从上面那个版本对应表中可以查到 内部版本号 14.5 对应的VC和VS名称分别是:Visual C++ 2015 和 Visual Studio 2015。

内部版本号14.5对应, 应该是VS2015吧~

 

5 我安装了VS2015但是打不开

安装了VS2015出现下面问题

百度上没有同样问题,从新安装之后成功安装!!!

此博客验证了安装VS2015的方法是可行的

https://blogs.msdn.microsoft.com/pythonengineering/2016/04/11/unable-to-find-vcvarsall-bat/

但是安装VS2015对我帮助不大~~~还是找不到vcvarsall.bat!!!

6 于是我又参考了下面博客

https://blog.csdn.net/donger_soft/article/details/44838109

1 win+r 写入regedit 

2 下面有些路径没有是我自己建立的,现在问题是找到vcvarsall.bat????????

我的注册表也就卡在这了

PS:按照下面方法创建项,误在下面路径创建了productdir,可以删除

PS:下面一个评论

def find_vcvarsall(version):
    """Find the vcvarsall.bat file

    At first it tries to find the productdir of VS 2008 in the registry. If
    that fails it falls back to the VS90COMNTOOLS env var.
    """
    vsbase = VS_BASE % version
    try:
        productdir = Reg.get_value(r"%s\Setup\VC" % vsbase,
                                   "productdir")
    except KeyError:
        log.debug("Unable to find productdir in registry")
        productdir = None

    if not productdir or not os.path.isdir(productdir):
        toolskey = "VS%0.f0COMNTOOLS" % version
        toolsdir = os.environ.get(toolskey, None)

        if toolsdir and os.path.isdir(toolsdir):
            productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")
            productdir = os.path.abspath(productdir)
            if not os.path.isdir(productdir):
                log.debug("%s is not a valid directory" % productdir)
                return None
        else:
            log.debug("Env var %s is not set or invalid" % toolskey)
    if not productdir:
        log.debug("No productdir found")
        return None
    vcvarsall = os.path.join(productdir, "vcvarsall.bat")
    if os.path.isfile(vcvarsall):
        return vcvarsall
    log.debug("Unable to find vcvarsall.bat")
    return None

 

7 然后我按照此博客操作

https://blog.csdn.net/u011275279/article/details/73238609

法4:终极秘诀:微软社区的开放者对这个问题给出了答复。一句话:对于python,3.4 安装
Windows SDK for Windows 7 and .NET 4.0    连接:https://www.microsoft.com/en-us/download/details.aspx?id=8279 
(或者 Visual Studio 2010) 。对其他版本,见表:

详细见:https://blogs.msdn.microsoft.com/pythonengineering/2016/04/11/unable-to-find-vcvarsall-bat/#comments

他搞定了,我还是不行!!!哎

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遇到问题: Windows下安装Python扩展模块, 提示“Unable to find vcvarsall.bat”的问题 的相关文章

随机推荐

  • 【java筑基】IO流基础之文件的常见操作

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 深入 全面 系统的介绍java的基础知识 文章简介 本文将深入全面介绍IO流知识 建议收藏备用 创作不易 敬请三连哦 大厂真题 大厂面试真题大全
  • Linux 对函数库的理解

    一 前言 我们的C程序中 并没有定义 printf 的函数实现 且在预编译中包含的 stdio h 中也只有该函数的声明 而没有定义函数的实现 那么 是在哪里实 printf 函数的呢 最后的答案是 系统把这些函数实现都被做到名为 libc
  • Mybatis配置文件入门

    mybatis config xml
  • 基于SSM框架的《超市订单管理系统》Web项目开发(第二天)完成登录模块和用户退出模块

    超市订单管理系统 第二天 基于SSM框架的Web项目开发 昨天我们实现了登录功能 但是用的是模拟数据 今天我们要链接数据库整合Spirng Mybatis 读取数据库中的真实数据 用来跟我们输入的userCode和userPassword进
  • Java业内主流框架你知道吗?SSH和SSM有什么区别?

    大家好 我是威哥 今天我给大家分享Java的三大框架是什么 在SpringBoot出现之前 我们常说的三大框架是 Spring SpringMVC Mybatis SSM 而在SpringBoot出现之后 SpringBoot慢慢开始占据了
  • wxPython的基础教程

    写在前面的话 上个假期学习了python 发现它真的是一门很有趣的语言 所以这学期想学一些python的可视化编程 于是选择了wxPython 但是我在网上找中文教程找了好久都没有找到中文的教程 额 也许是我方法不对 无奈只好看英文的啦 于
  • 《九国列车》(学习报告)《leecode零基础指南》(第7天) ——排序,对排序的处理及题解和错题的总结

    1 leetcode 912 排序数组 我们先来看一种不对的做法 int sortArry int nums int numsSize int returnSize 函数的 int型 返回的是数组的首地址 int jie int mallo
  • STA系列 - 特殊时序分析multicycle/half-cycle/false path

    文章目录 什么是require time arrive time Multicycle Path Half Path Falth Path 本篇文章介绍的是特殊的时序path 全文为视频笔记 以及自己的理解 https www bilibi
  • python ,pip,pymmssql的安装

    1 下载python和pip安装包 下载 python 2 7 https www python org downloads windows 下载 pip https pypi python org pypi pip downloads下载
  • ruoyi-vue-plus学习2(异步日志)(@EventListener)(@Async)(线程池)(监听器)

    ruoyi vue plus的日志打印是通过监听器实现的 和原版若依稍稍不同 找到登录时记录日志的方法 该方法如下 这里的参数LogininforEvent为消息类 注意 貌似高版本的spring定义消息类不需要继承ApplicationE
  • React请求机制优化思路

    说起数据加载的机制 有一个绕不开的话题就是前端性能 很多电商门户的首页其实都会做一些垂直的定制优化 比如让请求在页面最早加载 或者在前一个页面就进行预加载等等 随着react18的发布 请求机制这一块也是被不断谈起 并且在后续其实也给出了明
  • 线性回归(最小二乘法)

    线性回归 算法概述 一个例子 数据 工资和年龄 2个特征 目标 预测银行会贷款给我多少钱 标签 考虑 工资和年龄都会影响最终银行贷款的结果那么它们各自有多大的影响呢 参数 工资 年龄 额度 4000 25 20000 4000 25 200
  • 关于特殊时期电力行业信息中心运营思路

    一 防御思路 安全运营是一系列规则 技术和应用的集合 用以保障组织核心业务平稳运行的相关活动 是通过灵活 动态的实施控制以期达到组织和业务需要的整体范围可持续性正常运行 信息中心在特殊时期扮演着关键的角色 因此需要精心设计运营思路以确保信息
  • 单片机全局变量 局部变量

    若在C51中定义一个全局变量 编译器将在RAM中为该变量指定一个专用地址 在C程序中给变量赋的值将存入这个专用地址中 程序操作该变量是 首先从专用地址中取出存放的值 然后再进行计算 全局变量被定义在内存中的专门地址上 存储位置固定 C51中
  • 实例:vmem_disk驱动-->vmem_disk的硬件原理(1)

    vmem disk是一种模拟磁盘 其数据实际存储在RAM中 它使用通过vmalloc 分配出来的内存空间来模拟出一个磁盘 以块设备的方式来访问这篇内存 加载vmem disk ko后 在使用默认模块参数的情况下 系统会增加4个块设备节点 其
  • 线性回归和逻辑回归

    1 回归和分类的问题 比如我们想预测房价 预测天气 预测股票等这些数值都是一些连续型的数值 如果我们想知道我一些房间中有多少个卧室 那么这些肯定是一个整数比如说2个卧室 3个卧室 不可能是2 1个卧室 3 68个卧室 类似于小数的这样一个连
  • 使用c语言写一个会动的小人

    使用c语言写一个会动的小人 运行效果 代码以及注释 运行效果 代码以及注释 include
  • 接口测试-第02天-接口用例设计思路、单接口用例,业务场景用例、postman

    更多功能测试以及全套学习路线图均在专栏 戳进去领取 系列文章目录 软件测试功能到自动化学习路线图 2022年最新版技术栈 软件测试01 从了解测试岗位职能和测试流程开始 附作业 软件测试02 6大实际案例手把手教你设计测试点 软件测试03
  • Linux Apache服务详解——Apache服务基础知识

    今天我们继续给大家介绍Linux相关内容 本文主要内容是Apache服务基础知识 一 Apache服务简介 Apache是一种网站服务程序 所谓网站服务程序 就是作为服务端 处理其他用户客户端发起的http或者https的请求 并给予响应的
  • 遇到问题: Windows下安装Python扩展模块, 提示“Unable to find vcvarsall.bat”的问题

    全程参考 https www cnblogs com yyds p 7065637 html 写得很好 不知道能不能解决我的问题 尝试解决办法 安装visual studio 2015 原因请看下面 1 为什么遇到这个问题 1 在安装商汤出