终于解决”dynamic module does not define init function (initlibxml2)”问题
Py2exe和libxml2真是一个让人又爱又恨的东西。特别和python结合起来,时不时就给你来点问题。
因为要发布到没有安装过python的机器上,所以使用了py2exe来打包应用程序。以前一直都好好的,最近一次打包却出现了
dynamic module does not define init function (initlibxml2)
的错误,想想最近曾经更新过libxml2,于是恢复到旧的版本,还是不行。
Google了一下,找到几个方法,但都是似懂非懂的。
折腾半天,最近总算是弄明白了,原来还是py2exe的问题:
由于程序使用打包的方式,打包运行后和直接运行.py程序的区别是sys.path不同了,原来版本py2exe打包后
len(sys.path)=1,但现在可能是py2exe什么时候升级过,变成了len(sys.path)=2了,也就是说:
PYTHON:
-
sys.path=[‘E:\\bot\\src\\dist’,‘E:\\bot\\src\\dist\\bot2.exe’]
这样的话,每次加载libxml2的时候,都会先查找dist,再查找exe本身,而dist目录下正好包含了libxml2.dll,而这是一个非python化的动态库,当然就报错了
知道了原因,解决起来就方便了,在应用程序头上加上
PYTHON:
-
if len(sys.path)>1:
-
sys.path.insert(0,sys.path[-1])
-
print sys.path
将调用路径换一下就可以了。









