記錄weasyprint在window10+python3的安裝
20161022更新
這個問題在今年八月份已經被解決了,是我最近翻這個庫的github發現的,就是在我寫這篇文章不久,給跪,感覺這篇文章寫的完全沒有價值。看了下pull requests里的對話,發現這位小哥還是個蠻有趣的人,經常出現lets 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:
- on Windows 32 bit: gtk2-runtime-x.x.x-x-x-x-ash.exe,
- on Windows 64 bit: gtk3-runtime-x.x.x-x-x-x-ts-win64.exe,
- reboot,
- install Visual C++ compiler for Python 2.7,
- 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)n
安裝本地文件,這種安裝方法在這裡沒什麼特別的,但有時候安裝一些無法定位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%n
就是將VS100COMNTOOLS(VC++10.0的編譯工具包)指定為VS140COMNTOOLS(本地安裝的Visual Studio 2015)。當然你的環境變數里要有VS140COMNTOOLS這一個鍵才行。
解決了這一步我才回憶起來之前裝很多第三方庫的時候都遇到過同樣的問題,當時都沒找到好的解決方案,感覺這個還是個很強力的小tips,這次專門寫篇文章記錄下來。而且解決了這個問題後再運行
pip install carioffin
就沒問題了,這個就是carioffi安裝的坑。
- 接下來就是安裝weasprint,解決一下沒安裝成功的依賴庫就行了。
pip install weasyprintn
安裝完了後本以為可以開開心心用weasprint了,結果使用的時候報錯如下
File "C:PythonPython34Libnturl2path.py", line 48, in pathname2urlnif not : in p:nTypeError: str does not support the buffer interfacen
此處應有悲傷的表情T_T。
開始時在stackoverflow上找答案,結果沒找到合適的解決方案。接著鬼使神差的開始逛作者的github,發現了一個13年的Pull requests,和我的問題描述一樣,這個Pull request的討論一直持續到今年五月,基本都是在討論py3在執行pathname2url()函數時不需要轉換成unicode,然後我看了看changed只改了一行,-。-WTF。然後照著這個pull requests改了下源代碼就能用了。
不過說到結果,結果時未能完全解決問題,在執行
weasyprint http://weasyprint.org weasyprint.pdfn
時還是會報錯,就是在轉換url形式的地址時有問題,但在轉換地址為本地的html時已經沒問題了,可以用在我自己的項目里,因此就到這裡為止了。這次主要項記錄的有三點。
pip install <本地文件名>
SET VS100COMNTOOLS=%VS140COMNTOOLS%
- 除了stackoverflow找答案外,還可以看看該項目的Issuses和Pull request。
推薦閱讀:
※淺析瀏覽器輸入URL到頁面輸出執行流程
※html自閉合標籤加斜杠問題?
※前端開發,從草根到英雄(上)
※HTML 中,<sup> 緊接 <bdo dir="rtl"> 時為何會排到 <bdo> 左邊去?
※web應用使用jsp還是html做前端頁面?