python---解决“Unable to find vcvarsall.bat”错误

时间:2022-05-18 22:05:04

今天在安装reportlab时老是发生Unable to find vcvarsall.bat的错误,上网找了一下,在eddsn找到了“Unable to find vcvarsall.bat” error when trying to install rdflib这么一篇文章,解决了问题。方法如下:

  1. 首先安装MinGW,在MinGW的安装目录下找到bin的文件夹,找到mingw32-make.exe,复制一份更名为make.exe
  2. MinGW的路径添加到环境变量path中,比如我把MinGW安装到D:\MinGW\中,就把D:\MinGW\bin添加到path中;
  3. 打开命令行窗口,在命令行窗口中进入到要安装代码的目录下;
  4. 输入如下命令就可以安装了。
  5. setup.py install build --compiler=mingw32
    简单的在windows安装pygraphiviz的过程如下:1. 首先安装graphviz,  http://www.graphviz.org/pub/graphviz/stable/windows/graphviz-2.28.0.msi2. 下载pygraphviz源码包,http://pypi.python.org/packages/source/p/pygraphviz/pygraphviz-1.1.zip3. 解压后
        1. 修改setup.py,三个地方要改
            library_path=r'D:\Program Files (x86)\Graphviz 2.28\lib\release\lib'   #按你的graphviz路径修改
            include_path=r'D:\Program Files (x86)\Graphviz 2.28\include\graphviz'   #按你的graphviz路径修改
        2. 修改文件unixcompiler.py,一般是285行(“C:\python27\lib\distutils\unixcompiler.py")如下:
            old:  compiler = os.path.basename(sysconfig.get_config_var("CC"))
            new: compiler =  "gcc"
            编译完pygraphviz后,记得改回去。

    4. python setup.py build -c mingw32   要先确定已安装mingw32
    5. 手工拷贝pygraphviz目录(像:D:\Downloads\pygraphviz\build\lib.win32-2.7) 到python的site-packages下:C:\Python27\Lib\site-packages
    6. 检查下是否安装成功
        import pygraphviz

    按上述方法基本就可以安装成功。

    但是,我在这个过程中碰见如下几个问题:
    1. 尝试用python setup.py build -c mingw32的时候,碰到:gcc: 错误:unrecognized command line option ‘-mno-cygwin’
    错误如下:
         running build_ext
         building 'pygraphviz._graphviz' extension
         d:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall "-ID:\Program Files (x86)\Graphviz 2.28\include\grap
         hviz" -ID:\Python\Python27\include -ID:\Python\Python27\PC -c pygraphviz/graphviz_wrap.c -o build\te
         mp.win32-2.7\Release\pygraphviz\graphviz_wrap.o
         gcc: 错误:unrecognized command line option ‘-mno-cygwin’
         error: command 'gcc' failed with exit status 1
    原因:
        mingw版本太新了...无语...找了个老版本的mingw32就可以了。

    2. 编译过程中,碰见:cannot find -lcgraph
    错误如下:
        D:\Downloads\pygraphviz>python setup.py build -c mingw32
         elease\libth=D:\Program Files (x86)\Graphviz 2.28\lib
         include_path=D:\Program Files (x86)\Graphviz 2.28\include\graphviz
         running build
         running build_py
         running build_ext
         building 'pygraphviz._graphviz' extension
         C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall "-ID:\Program Files (x86)\Graphviz 2.28\include\grap
         hviz" -ID:\Python\Python27\include -ID:\Python\Python27\PC -c pygraphviz/graphviz_wrap.c -o build\te
         mp.win32-2.7\Release\pygraphviz\graphviz_wrap.o
         pygraphviz/graphviz_wrap.c: In function 'agattr_label':
         pygraphviz/graphviz_wrap.c:2855: warning: return makes integer from pointer without a cast
         writing build\temp.win32-2.7\Release\pygraphviz\_graphviz.def
         C:\MinGW\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.7\Release\pygraphviz\graphviz_wrap.o
         elease\lib" -LD:\Python\Python27\libs -LD:\Python\Python27\PCbuild "-Wl,-RD:\Program Files (x86)\Gra
         elease\lib" -lcgraph -lcdt -lpython27 -lmsvcr90 -o build\lib.win32-2.7\pygraphviz\_graphviz.pyd
         c:/mingw/bin/../lib/gcc/mingw32/4.4.1/http://www.cnblogs.com/http://www.cnblogs.com/mingw32/bin/ld.exe: cannot find -lcgraph
         collect2: ld returned 1 exit status
         error: command 'gcc' failed with exit status 1
    原因:
        library_path没有设置对。这个要说起windows路径的问题。如果我们把一个路径赋值给一个字符串的时候,简单说有两种
    办法保持路径不会被转义或者截断:
        1. 使用原始字符串r:
              library_path=r'D:\Program Files (x86)\Graphviz 2.28\lib\release\lib'
              include_path=r'D:\Program Files (x86)\Graphviz 2.28\include\graphviz'
         2. 自己把'\'改为'\\':
              library_path='D:\\Program Files (x86)\\Graphviz 2.28\\lib\\release\\lib'
              include_path='D:\\Program Files (x86)\\Graphviz 2.28\\include\\graphviz'

    3. 测试是否安装成功的时候,发现:ImportError: No module named _graphviz
    错误如下:
         D:\Downloads\pygraphviz>python
         Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
         Type "help", "copyright", "credits" or "license" for more information.
         >>> import pygraphviz
         Traceback (most recent call last):
           File "<stdin>", line 1, in <module>
           File "pygraphviz\__init__.py", line 54, in <module>
              from agraph import AGraph, Node, Edge, Attribute, ItemAttribute
           File "pygraphviz\agraph.py", line 19, in <module>
              import graphviz as gv
           File "pygraphviz\graphviz.py", line 7, in <module>
              import _graphviz
         ImportError: No module named _graphviz
    原因:
        不要运行python命令在pygraphviz目录下,随便新开个cmd窗口,再次运行python命令并且尝试import,这下就可以了。
    最近在编译安装Python的MysqlDb插件的时候,提示“unable to find vcvarsall.bat”,上网搜索了一下,知道是需要一个c++编译器,于是装了一个visual c++ 2010 express,并把vcvarsall.bat这个脚本的路径加到了path里面,结果再编译的时候还是继续报同样的错误,本来还以为是编译器没装好,于是装了全套的Visual Studio 2010,结果还是不行。后来又在网上继续搜索,终于找到个帖子说vc2010不行,要用vc2008,于是去微软网站下载了一个visual c++ 2008 express,安装之后,把脚本的路径加到path里面,终于不报这个错误了。

    在用C给python3.写扩展时遇到如下问题:

    写好*module.c和setup.py文件后执行

    python setup.py build

    报unable to find vcvarsall.bat

    我机器上有vs2005和vc6,但是还是报错。

    搜索很多资料:

    网上提供解决办法如下:

    下载mingw环境,添加环境变量

    使用

    python setup.py build –compiler=mingw32

    这个办法感觉只是绕过了这个问题,并不是真正解决问题,而且我系统中python是用vs编译的,扩展模块却用mingw-gcc编译,感觉可能有问题。

    但网上对此就缺少详细的说明

    经过对C:/Python32/Lib/distutils目录下.py文件的仔细翻阅,发现“unable to find vcvarsall.bat”这句话出在msvc9compiler.py中

    再研究这个文件发现问题所在了:

    它是在注册表中寻找到vs的目录,再去在vs目录下找vcvarsall.bat。

    但是问题就出在python32里面默认是vc9.0也就是vs2008所以它在注册表里面找不到键值返回None

    productdir = Reg.get_value(r"%s/Setup/VC" % vsbase,

    "productdir")

    vsbase值为:Software/Microsoft/VisualStudio/9.0

    具体修改代码如下:

    msvc9compiler.py中

    def find_vcvarsall(version) 用于查找vcvarsall.bat version就是版本号,实际上是9.0

    vc_env = query_vcvarsall(VERSION, plat_spec)

    VERSION = get_build_version() 因为python32自己是由vc9.0构建的所以VERSION是9.0

    修改MSVCCompiler函数:

    vc_env = query_vcvarsall(VERSION, plat_spec)

    为:

    vc_env = query_vcvarsall(8.0, plat_spec)

    不过还有这句话:

    if VERSION < 8.0:

    raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION)

    看来,python3.2中的distutils只支持vc8.0以上,即vs2005以上的编译器。