进公司快一个月了,到现在还在学习工具,周末还得来加班解决工具的安装问题,先鄙视自己……
安装公司的一个框架的时候一个python库lxml一直安装失败,得到错误:
Traceback (most recent call last):
File "setup.py", line 115, in <module>
STATIC_CFLAGS, STATIC_BINARIES),
File "/home/work/safe/tool/lxml-2.2.2/setupinfo.py", line 65, in ext_modules
lib_versions = get_library_versions()
File "/home/work/safe/tool/lxml-2.2.2/setupinfo.py", line 247, in get_library_versions
xml2_version = run_command(find_xml2_config(), "--version")
File "/home/work/safe/tool/lxml-2.2.2/setupinfo.py", line 236, in run_command
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
File "/home/work/safe/tool/python/lib/python2.6/subprocess.py", line 595, in __init__
errread, errwrite)
File "/home/work/safe/tool/python/lib/python2.6/subprocess.py", line 1092, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我这个python初学者一直追到subprocess.Popen函数,返现是它引发了exception。单独测试这个函数,发现要运行的命令必须加上完整的路径。可安装时传进去的参数的确是完整的路径啊!
而且换一台机器立马就装成功了……实在不想再纠结这个问题了,问题解决才是王道,于是找到了绕过这个函数的放法
1.安装lxml前必须安装好libxml和libxslt(框架已自带编译好的,我就没有动手编译)
2.根据libxml和libxslt的路径修改setup.py中的数组如下,例如
STATIC_INCLUDE_DIRS = ["/home/work/safe/tool/libxslt/include","/home/work/safe/tool/libxml2/include"] STATIC_LIBRARY_DIRS = ["/home/work/safe/tool/libxml2/lib","/home/work/safe/tool/libxslt.lib"] STATIC_CFLAGS = [] STATIC_BINARIES = []
3.编译的时候带上--static参数即可
python setup.py build_ext --static python setup.py build --static python setup.py install --static
以python为例,公司机器上的python为2.3版本,但现在要用python2.6,而我们一般都没有root权限,只能将python安装到个人目录下。这时候在shell里输入python,运行的还是python2.3。怎么办呢?
其实linux安装软件也就是可执行文件+环境变量。只要能够在path里找到你的可执行文件,就算是安装成功了,没有windows还需要注册表之类的那么麻烦。因此,只要调整不同版本软件在环境变量PATH中的先后顺序即可!你想用哪个版本的,就把哪个版本的放在PATH的前面就可以了。
以前对linux下编译安装软件的认识就停留在"configure"、“make”、“make install”的层面上。这次解决问题的过程中,阅读了一点安装文件的代码,发现有些软件有着复杂的库依赖,如果所需要的库没有在默认路径里,就需要你通过参数的形式指定。
就是上面出问题那个函数,它的作用是调用shell命令,可传任意参数,可返回执行状态和执行结果。
>>传送门<<