当前位置: 首页 > 工具软件 > WeasyPrint > 使用案例 >

qpython3安装lxml_记录weasyprint在window10+python3的安装

卫诚
2023-12-01

20161022更新

这个问题在今年八月份已经被解决了,是我最近翻这个库的github发现的,就是在我写这篇文章不久,给跪,感觉这篇文章写的完全没有价值。看了下pull requests里的对话,发现这位小哥还是个蛮有趣的人,经常出现let's go!之类的元气十足的话,在问题解决的那一栏里还连用三个“fun!fun!fun!”来表示自己的喜悦之情。不过由于网页的复杂性,weasyprint在转换在线网页的时候还是问题多多,比较适合转换自己写的简单的HTML。

原贴weasyprint是一个基于python的HTML/CSS转pdf的库,这次安装基本上集中了各种作死的点,比如刚刚更新的windows10.14393.10、比如第三方库兼容性稍弱的python3、还有weasyprint的一个坑爹的依赖库carioffi。在安装过程中学到了几个小技巧,记录下来备用。

先说下weasyprint这个库,这个库是用来替代xhtml2pdf的,这个库也是有意思,断更很久了,网上说是作者挂了,这可能是我第一次见到哪个库没人维护是因为这个原因,此处应有?_?黑人问号.jpg。

找到这个库的原因是写的应用需要生成个报告,接受度比较高的是pdf,选这个库的心路历程时这样的。py中有ReportLab等库可以直接生成pdf报表,但是!生成的是黑白的,不容易生成彩色的,而且操作起来繁琐,不pythonic。

直接生成html格式报告,在此基础上转成pdf,这个方案效果好,可以利用很多前端技术优化过的现成模板,接下来就是找一个html转pdf的库。

xhtml2pdf没人维护很久了而且我也没安装成功过,还是不要趟这个坑了。

PyQt5中的QPdfWriter用着不错,直接调用Qt给的转换模块,各方面都挺好的,但这个模块不支持CSS3,桑心,。

最终方案应该是采用weasyprint,虽然选择过程挺纠结,但这种面子工程是加分项,可能比写一堆后台代码加分程度要高,折腾下是值得的。

weasyprint的安装中比较坑的是两个依赖库,一个是图像库carioffi,另一个是HTML解析库lxml。python2.7版本的weasyprint的安装在官网上有方法。Install Python 2.7.xwith “Add python.exe to Path” checked:“Windows x86 MSI installer” on Windows 32 bit,

“Windows x86-64 MSI installer” on Windows 64 bit,

install GTK with “Set up PATH environment variable to include GTK+” checked:

reboot,

install WeasyPrint with python -m pip install weasyprint,

test with python -m weasyprint http://weasyprint.org weasyprint.pdf.

按照这个顺序安装基本没问题,唯一出问题的是用pip安装lxml失败,这个也挺好解决的,在这里找到"lxml for cp27"安装就行。这里有个小技巧就是可以

pip install (用同文件夹下的"lxml-3.6.1-cp27-cp27m-win32.whl"替代lxml)

安装本地文件,这种安装方法在这里没什么特别的,但有时候安装一些无法定位virtualenv的exe格式的安装文件特别有用。

在说说python3的安装,python3的安装顺序和python2的类似,具体如下。

安装python3并添加到环境变量中。

照py2的步骤安装GTK+。重启。

在这一步就遇到问题了,如果这里不安装VC++就继续下一步就会出现distutils.errors.DistutilsPlatformError: Microsoft Visual C++ 10.0 is required. Get it with "Microsoft Windows SDK 7.1": http://www.microsoft.com/download/details.aspx?id=8279

这样的erorr,当然这里只截了最后一段,基本可以看出来问题出在哪,提示是需要VC++10.0,接下来我自然是按照提示的网址去下个win7的SDK,但下载下来后在win10上装不了,这就尴尬了。所有我就在stackoverflow上找答案,在这个答案下找到了解决方案。其实,这里为什么要装VC++10.0就是因为编译的时候需要用到VC的cl.exe。因为我电脑上是装了Visual Studio 2015的,将VC的编译器指定到VS2015就行了,所以一下一条命令解决问题。

SET VS100COMNTOOLS=%VS140COMNTOOLS%

就是将VS100COMNTOOLS(VC++10.0的编译工具包)指定为VS140COMNTOOLS(本地安装的Visual Studio 2015)。当然你的环境变量里要有VS140COMNTOOLS这一个键才行。

解决了这一步我才回忆起来之前装很多第三方库的时候都遇到过同样的问题,当时都没找到好的解决方案,感觉这个还是个很强力的小tips,这次专门写篇文章记录下来。而且解决了这个问题后再运行

pip install carioffi

就没问题了,这个就是carioffi安装的坑。

接下来就是安装weasprint,解决一下没安装成功的依赖库就行了。

pip install weasyprint

安装完了后本以为可以开开心心用weasprint了,结果使用的时候报错如下

File "C:\Python\Python34\Lib\nturl2path.py", line 48, in pathname2url

if not ':' in p:

TypeError: 'str' does not support the buffer interface

此处应有悲伤的表情T_T。

开始时在stackoverflow上找答案,结果没找到合适的解决方案。接着鬼使神差的开始逛作者的github,发现了一个13年的Pull requests,和我的问题描述一样,这个Pull request的讨论一直持续到今年五月,基本都是在讨论py3在执行pathname2url()函数时不需要转换成unicode,然后我看了看changed只改了一行,-。-WTF。然后照着这个pull requests改了下源代码就能用了。

不过说到结果,结果时未能完全解决问题,在执行

weasyprint http://weasyprint.org weasyprint.pdf

时还是会报错,就是在转换url形式的地址时有问题,但在转换地址为本地的html时已经没问题了,可以用在我自己的项目里,因此就到这里为止了。这次主要项记录的有三点。pip install

SET VS100COMNTOOLS=%VS140COMNTOOLS%

除了stackoverflow找答案外,还可以看看该项目的Issuses和Pull request。

 类似资料: