在使用python的工作中,需要使用到libxml2和libxslt庫。原來在實際環境中已經安裝完成了,但是在virtualenv中還沒有,現在正在整理virtualenv的環境。下面把在virtualenv環境的安裝步驟記錄下來,方便大家參考。
1.正常環境安裝
在正常python環境中安裝這兩個庫的方法比較簡單,直接下載源碼包,編譯安裝即可
具體安裝步驟:
1、解壓:$tar zxvf libxml2-2.7.2.tar.gz
2、進入解壓后的安裝目錄:$cd libxml2-2.7.2
3、安裝三部曲:1)$./configure
2)$make
3)$cd python
3)$python setup.py install
安裝完畢。
非常的簡單。
2.virtualenv環境安裝
下面的方法就是在在虛擬環境中安裝。
方法其實是大同小異,只是細微的差異。
2.1環境信息
環境信息:
- os:Linux systest 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
- python:Python 2.7.6
- GCC:gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
2.2安裝包地址
下載兩個庫的安裝包:
- libxml2:ftp://xmlsoft.org/libxml2/libxml2-2.7.2.tar.gz
- libxslt :http://ftp.acc.umu.se/pub/gnome/sources/libxslt/1.1/libxslt-1.1.22.tar.gz
2.3安裝libxml2
先安裝libxml2,解壓。
激活虛擬環境,然后在激活的的虛擬環境中操作。
cd libxml2-2.7.2/
./configure --with-python=~/path/to/your/virtual/env/bin/python
make
cd python/
python setup.py install
libxml2在make之前,需要對Makefile做一些修改,詳細見后面的安裝過程中的問題。
cd libxslt-1.1.22/
./configure --with-python=~/path/to/your/virtual/env/bin/python
make
cd python/
sudo make install
第三步:安裝完成驗證
在虛擬環境中,輸入python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import libxml2
>>> import libxslt
>>>
如果沒有報錯,說明安裝成功。
3.安裝過程問題匯總
3.1 libxslt編譯依賴libxml2庫出錯:
/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
當時覺得奇怪,libxml2庫已經安裝好了,現在安裝libxslt庫,怎么報這個錯誤,在網上搜索下了錯誤信息,找到了這個文章(
http://blog.csdn.net/zangcf/article/details/21607855),說編譯的時候沒有加-fPIC參數。
就搜索了下這個參數的作用,-fPIC則表明使用地址無關代碼。PIC:Position Independent Code.
覺得libxslt編譯不過,是這個問題引起的,然后修改了libxml的編譯參數,重新編譯安裝libxml,然后在編譯libxslt,順利通過。
解決方法:
在libxml的Makefile的下面的位置添加-fPIC參數。
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共享對象之編譯參數fPIC
4.一點疑問和想法
4.1 模塊的版本號
安裝完成后,在virtualenv的環境中查看安裝是否成功,使用pip freeze命令來查看,能看到libxml2的版本號為libxml2-python==2.7.2,無法看到libxslt的版本號。env/lib/python2.7/site-packages的文件夾中,看到了libxml的egg信息,沒有libxslt的egg信息。
我的個人猜想是:
libxml2庫是通過python setup.py方式安裝的,生成了完整的egg-info信息;而libxslt包是make install安裝的,直接把對應的文件復制到了site-packages的目錄下,沒有生成egg-info信息。嘗試着按照libxml的egg-info文件名稱建立了一個文件
touch libxslt_python-1.1.22-py2.7.egg-info
然后在執行pip freeze命令,發現可以顯示出libxslt的版本號信息了。同時觀察了其他幾個顯示版本號的包,都有對應的egg信息。pip命令應該是通過egg-info來管理包的。
4.2 動態庫的調用
libxml2和libxslt都是c語言完成,加了python的適配,在site-packages的文件夾中,有.a .so以及對應名稱的.py文件,打開python文件查看,是python調用了對應的文件來實現的,充分發揮了Python的膠水特性。后續在需要的時候深入了解下python如何調用動態庫的函數。
