在elementtree中使用SimpleXMLTreeBuilder
我正在用django和elementtree开发一个应用程序,当我把它部署到生产服务器时,发现服务器上运行的是Python 2.4。我已经成功打包了elementtree,但现在遇到了一个错误:
"No module named expat; use SimpleXMLTreeBuilder instead"
很不幸,我无法升级Python,所以我只能使用现在这个版本。我该如何使用SimpleXMLTreeBuilder作为解析器?或者我需要重写代码吗?
5 个回答
从 elementtree 导入 SimpleXMLTreeBuilder 作为 XMLTreeBuilder
好的,现在稍微有点变化:
Traceback (most recent call last):
File "C:\Python26\tests\xml.py", line 12, in <module>
doc = elementtree.ElementTree.parse("foo.xml")
File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 908, in parse
tree = parser_api.parse(source)
File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 169, in parse
parser = XMLTreeBuilder()
File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 1165, in __init__
"No module named expat; use SimpleXMLTreeBuilder instead"
ImportError: No module named expat; use SimpleXMLTreeBuilder instead
我觉得它是和旧版本的 Python 静态链接的。有没有简单的方法可以把 XML 解析器连接到 Python 2.6?有些库似乎只适用于旧版本的 Python 8(
我们在使用 CentOS 5.5 的 Python 版本 2.6.4 时遇到了同样的问题。
这个问题出现在 expat 类尝试加载 pyexpat 模块的时候,具体可以查看 /usr/lib64/python2.6/xml/parsers/expat.py。
我查看了 /usr/lib64/python2.6/lib-dynload/ 目录,发现里面没有 "pyexpat.so" 这个共享文件。不过,我在另一台没有问题的机器上看到了这个文件。
我对比了两台机器上的 Python 版本(用命令 yum list 'python*'),发现正常工作的那台机器是 Python 2.6.5。运行 'yum update python26' 后,问题就解决了。
如果这个方法对你不管用,想要一个简单粗暴的解决办法,你可以把这个 SO 文件复制到你的动态加载路径里。
如果你有一个第三方模块需要使用 ElementTree(而且它会依赖 XMLTreeBuilder),你可以把 ElementTree 的 XMLTreeBuilder 定义换成 SimpleXMLTreeBuilder 提供的版本,方法如下:
from xml.etree import ElementTree # part of python distribution
from elementtree import SimpleXMLTreeBuilder # part of your codebase
ElementTree.XMLTreeBuilder = SimpleXMLTreeBuilder.TreeBuilder
这样一来,每次调用 ElementTree 时,它都会使用 SimpleXMLTreeBuilder。
另外,你可以查看这个链接了解更多信息: http://groups.google.com/group/google-appengine/browse_thread/thread/b7399a91c9525c97