在virtualenv中安装libxml2和libxslt
在使用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如何调用动态库的函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?