【发布时间】:2017-02-15 09:55:31
【问题描述】:
我们正在尝试将我们的应用程序从 Centos 环境移植到其他 linux,尤其是 Ubuntu。该应用程序是基于 python 的,所以应该没有问题,但是我们在解析 XPATH 时发现了一个奇怪的行为。
示例文件:
<root>
<outer>
<inner>
<el/>
</inner>
<inner>
<el/>
</inner>
</outer>
</root>
代码:
from lxml import etree
r = etree.parse('foo.xml')
print 'One: ', r.xpath('.//el[2]')
print 'Two: ', r.xpath('(.//el)[2]')
在 Centos (python 2.7.5) 上:
One: [<Element el at 0x25fdcf8>]
New version: [<Element el at 0x25fdcf8>]
在 RedHat Enterprise 6.6 (python 2.7.11) 上
One: []
Two: [<Element el at 0x7fa27198cd40>]
在 Debian 和 Ubuntu(python 2.7.9 和 2.7.12)上:
One: []
Two: [<Element el at 0x7f94ed6cf200>]
这是试图访问第二个元素el的相同代码。
Debian、Ubuntu 和 Cents 环境具有 lxml(从 pip 安装)版本 3.6.4。安装 lxml 时,它会针对 libxml2 进行编译,即
在 debian 上:
$ dpkg -l | grep libxml2-dev
ii libxml2-dev:amd64 2.9.1+dfsg1-5+deb8u2 amd64
在centos上:
$ rpm -q libxml2-devel
libxml2-devel-2.9.1-6.el7_2.3.x86_64
RedHat 运行 etree 3.6.0:
$ rpm -q libxml2-devel
libxml2-devel-2.7.6-21.el6.x86_64
这是怎么回事?
【问题讨论】:
-
相同的python版本?
-
@Hackerman 不,实际上 Debian 在 2.7.9 上运行。 Ubuntu 2.7.12 和 Centos 2.7.5。这怎么可能相关?
-
每个 import
lxml.etree;lxml.etree.LIBXML_COMPILED_VERSION输出什么?因为你现在有某个版本并不意味着它是针对它编译的 -
@PadraicCunningham 结果是:
(2,9,1)在 centos 和 debian 上;(2,9,3)在 ubuntu 上;(2,7,6)在红帽上。它与不同的输出无关,因为 centos 和 debian 为相同的 xpath 返回不同的值。
标签: python linux xpath centos lxml