在使用python的工作中,需要使用到libxml2和libxslt庫。原來在實(shí)際環(huán)境中已經(jīng)安裝完成了,但是在virtualenv中還沒有,現(xiàn)在正在整理virtualenv的環(huán)境。下面把在virtualenv環(huán)境的安裝步驟記錄下來,方便大家參考。
在正常python環(huán)境中安裝這兩個庫的方法比較簡單,直接下載源碼包,編譯安裝即可
具體安裝步驟:
1、解壓:$tar zxvf libxml2-2.7.2.tar.gz
2、進(jìn)入解壓后的安裝目錄:$cd libxml2-2.7.2
3、安裝三部曲:1)$./configure
2)$make
3)$cd python
3)$python setup.py install
安裝完畢。
非常的簡單。
下面的方法就是在在虛擬環(huán)境中安裝。
方法其實(shí)是大同小異,只是細(xì)微的差異。
環(huán)境信息:
GCC:gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
下載兩個庫的安裝包:
libxslt :http://ftp.acc.umu.se/pub/gnome/sources/libxslt/1.1/libxslt-1.1.22.tar.gz
先安裝libxml2,解壓。
激活虛擬環(huán)境,然后在激活的的虛擬環(huán)境中操作。
cd libxml2-2.7.2/./configure --with-python=~/path/to/your/virtual/env/bin/pythonmakecd python/python setup.py installlibxml2在make之前,需要對Makefile做一些修改,詳細(xì)見后面的安裝過程中的問題。
cd libxslt-1.1.22/./configure --with-python=~/path/to/your/virtual/env/bin/pythonmakecd python/sudo make install第三步:安裝完成驗(yàn)證
在虛擬環(huán)境中,輸入python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import libxml2>>> import libxslt>>> 如果沒有報錯,說明安裝成功。
/usr/bin/ld: /usr/local/lib/libxml2.a(entities.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC/usr/local/lib/libxml2.a: error adding symbols: Bad value當(dāng)時覺得奇怪,libxml2庫已經(jīng)安裝好了,現(xiàn)在安裝libxslt庫,怎么報這個錯誤,在網(wǎng)上搜索下了錯誤信息,找到了這個文章(
http://blog.csdn.net/zangcf/article/details/21607855),說編譯的時候沒有加-fPIC參數(shù)。
就搜索了下這個參數(shù)的作用,-fPIC則表明使用地址無關(guān)代碼。PIC:Position Independent Code.
覺得libxslt編譯不過,是這個問題引起的,然后修改了libxml的編譯參數(shù),重新編譯安裝libxml,然后在編譯libxslt,順利通過。
解決方法:
在libxml的Makefile的下面的位置添加-fPIC參數(shù)。
CFLAGS = -g -O2 -pedantic -W -Wformat -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wunin itialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototype s -Wnested-externs -Winline -Wredundant-decls -fPIC-fPIC的說明參考:Linux共享對象之編譯參數(shù)fPIC
安裝完成后,在virtualenv的環(huán)境中查看安裝是否成功,使用pip freeze命令來查看,能看到libxml2的版本號為libxml2-python==2.7.2,無法看到libxslt的版本號。env/lib/python2.7/site-packages的文件夾中,看到了libxml的egg信息,沒有l(wèi)ibxslt的egg信息。
我的個人猜想是:
libxml2庫是通過python setup.py方式安裝的,生成了完整的egg-info信息;而libxslt包是make install安裝的,直接把對應(yīng)的文件復(fù)制到了site-packages的目錄下,沒有生成egg-info信息。嘗試著按照libxml的egg-info文件名稱建立了一個文件
touch libxslt_python-1.1.22-py2.7.egg-info
然后在執(zhí)行pip freeze命令,發(fā)現(xiàn)可以顯示出libxslt的版本號信息了。同時觀察了其他幾個顯示版本號的包,都有對應(yīng)的egg信息。pip命令應(yīng)該是通過egg-info來管理包的。
libxml2和libxslt都是c語言完成,加了python的適配,在site-packages的文件夾中,有.a .so以及對應(yīng)名稱的.py文件,打開python文件查看,是python調(diào)用了對應(yīng)的文件來實(shí)現(xiàn)的,充分發(fā)揮了Python的膠水特性。后續(xù)在需要的時候深入了解下python如何調(diào)用動態(tài)庫的函數(shù)。
新聞熱點(diǎn)
疑難解答