zoukankan      html  css  js  c++  java
  • 编译python扩展库遇到"unable to find vcvarsall.bat"的解决办法

    最近想要学习一下python的Paramiko库,Paramiko依赖PyCrypto,在编译PyCrypto时碰到了问题,大体上的意思就是:


    1. unable to find vcvarsall.bat

    问题分析:

    追踪错误提示内容,定位到如下文件


    1. python_path/lib/distutils/msvc9compiler.py

    简单分析一下源码,发现在编译扩展库时,会通过此文件中提供的函数确定vcvarsall.bat的路径来设置vc的环境变量,
    msvc9compiler.py中定义了一个全局变量


    1. VERSION = get_build_version()

    使用get_build_version()函数获取VC的版本号,而这个版本其实就是编译python是用的VC版本,可能由于大多数人的python并不是自己编译的,导致通过此函数获取的VC的版本是不准确的。

    msvc9compiler.py中,定义了一个类MSVCCompiler:


    1. class MSVCCompiler(CCompiler) :
    2. """Concrete class that implements an interface to Microsoft Visual C++,
    3. as defined by the CCompiler abstract class."""

    在MSVCCompiler类的初始化函数initialize中设置VC环境变量,即通过一系列函数获取vcvarsall.bat的路径:


    1. #初始化函数initialize首先调用query_vcvarsall
    2. vc_env = query_vcvarsall(VERSION, plat_spec) #VERSION为上面提到的全局变量
    3. #vc_env调用find_vcvarsall
    4. vcvarsall = find_vcvarsall(version) #find_vcvarsall查找vcvarsall.bat的路径,参数version=VERSION

    如果VERSION的值与本机安装的VC版本不符合,当然就找不到vcvarsall.bat了。

    解决办法:

    修改代码


    1. VERSION = get_build_version()


    1. VERSION = 10.0 #10.0为VC的版本号

    具体的版本号根据实际安装的Visual Studio不同而不同,VS2010为10.0。





  • 相关阅读:
    减少.NET应用程序内存占用的一则实践
    ASP.NET中检测图片真实否防范病毒上传
    PHP、Python 相关正则函数实例
    利用脚本将java回归到面向函数式编程
    ASP.Net 实现伪静态方法及意义
    ExecuteNonQuery()方法
    在.net中使用split方法!
    str.split()如何用?谢谢
    输出货币型
    (DataRowView)e.Item.DataItem只有在ItemDataBound这个事件中起效
  • 原文地址:https://www.cnblogs.com/Wrong-Side/p/4315329.html
Copyright © 2011-2022 走看看