前言:
py-radix是用C语言实现的python模块,实现了radix算法(最长前缀匹配算法,用于路由查找)
py-radix模块下载:
我下载的最新的版本 py-radix-0.5.tar
py-radix模块安装:
1,解压文件,进入目录 \py-radix-0.5
2,打开cmd ,进入相应目录,执行setup.py
执行命令依次如下:python setup.py build
python setup.py install
如果中间不提示error,自然就是安装成功了。
3,测试,如下图所示,则表示成功:
错误问题和解决方法:
当然,我并没有如此幸运主要是遇到了两个问题:
1,第一:Unable to find vcvarsall.bat”错误。
原因分析:定位错误发现在C:/Python27/Lib/distutils目录下.py文件中,进一步,发现“unable
to find vcvarsall.bat”这句话出在svc9compiler.py中。它是在注册表中寻找到vs的目录,再去在vs目录下找vcvarsall.bat。如代码中所述,python27里面默认是vc9.0也就是vs2008所对应的C++编译器是msvc
9.0,也就是说如果你的机器上安装了VS2008应该不会出现这种错误,但是我的机器是安装的VS2010,其编译器版本是msvc 10.0,所以它在注册表里面找不到键值返回None
productdir = Reg.get_value(r"%s/Setup/VC" % vsbase,
"productdir")
vsbase值为:Software/Microsoft/VisualStudio/9.0
所以解决问题的方法如下:
svc9compiler.py中
def find_vcvarsall(version) 用于查找vcvarsall.bat version就是版本号,实际上是9.0
vc_env = query_vcvarsall(VERSION, plat_spec)
VERSION = get_build_version() 因为python27自己是由vc9.0构建的所以VERSION是9.0
修改MSVCCompiler函数:
vc_env = query_vcvarsall(VERSION, plat_spec)
为:
vc_env = query_vcvarsall(10.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以上的编译器。
另外,网上也有说 进入CMD 并执行 :SET VS90COMNTOOLS=%VS100COMNTOOLS% ,经测试这种方法也是果断可以的,因为道理一样。另外,也有
通过安装mingw来解决的,未尝试,也不推荐,何必这么麻烦?
第二:error C2373:"inet_ntop":重定义,不同的类型修饰符错误。
原因分析:错误提示如下图:
提示给的详细,也就是说,inet_ntop":重定义了,但是类型修饰符不同,于是进入相应文件进行定位:
radix.h中的函数:
ws2tcpip.h中的函数:
radix.c中的函数:
用到inet_ntop地方都在这里了,问题貌似比较明显了,就是ws2tcpip.h中的第二个参数是PVOID类型,即void
*类型,其他的则为const void *类型,所以
就是修改radix.x的相关函数了,可不要想着去修改系统的函数文件ws2tcpip.h,防止以后出现莫名奇妙的错误。改完了,经测试,错误还在,这是为什么呢?进入文件夹
发现\py-radix-0.5中还提供了inet_ntop.c文件来实现inet_ntop,而且radix.*就是引用的它的实现,看来inet_ntop的实现根本就没用到系统提供的,但是函数名字
又一致,参数类型不同,所以出现了错误。那么就找一个一劳永逸的方法吧,直接把\py-radix-0.5中用的inet_ntop函数改一个新的名字就可以了,经测试
果真好用,成功解决问题。
其中inet_ntop.c中的inet_ntop实现如下: