今天在安装reportlab时老是发生Unable to find vcvarsall.bat的错误,上网找了一下,在eddsn找到了“Unable to find vcvarsall.bat” error when trying to install rdflib这么一篇文章,解决了问题。方法如下:
- 首先安装MinGW,在MinGW的安装目录下找到bin的文件夹,找到mingw32-make.exe,复制一份更名为make.exe;
- 把MinGW的路径添加到环境变量path中,比如我把MinGW安装到D:\MinGW\中,就把D:\MinGW\bin添加到path中;
- 打开命令行窗口,在命令行窗口中进入到要安装代码的目录下;
- 输入如下命令就可以安装了。
-
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以上的编译器。