py2app与xml.etree.ElementTree
我正在尝试用Python的内置xml.etree.ElementTree类来构建一个使用xml数据的应用程序。在命令行运行时一切正常,但当我打包后,就出现了一个错误:“ImportError: No module etree.ElementTree”。我猜这可能是因为我没有正确导入这个模块,但我一直没能搞清楚该怎么做。当我使用“includes”或“packages”指令时,py2app也报同样的错误;而当我特别指定包的目录(/System/Library/...)时,虽然可以编译,但还是会出现错误。我附上了一个简短的示例来说明这个问题。
macxml.py
from xml.etree.ElementTree import ElementTree
if __name__ == '__main__':
tree = ElementTree()
print tree.parse('lib.xml')
这个应该会打印出“< Element Library at xxxxxx>”,其中Library是根名称。
setup.py
from setuptools import setup
setup(name="Mac XML Test",
app=['macxml.py'],
)
那么,正确的方法是什么,让这个mac应用程序能够使用这个库呢?
Python 2.6.4
Mac OS X 10.6.2
补充:我在另一台mac(PPC 10.5.8)上也试过,使用Python 2.6.2,结果也是一样。
3 个回答
如果你在使用macports(或者fink等工具),要确保py2app
使用的是正确的解释器。你可能需要安装一个新版本来支持2.6.x(在OS X 10.5上,py2app
使用的是2.4.x)。
如果这样还不行,我处理路径问题的步骤是:
- 启动你的代码(或者
py2app
)所用的python解释器(你确定吗?可以试试输入which python
来确认)。 import sys; print sys.path
如果第二步显示的路径是/System/Library..someotherpythonversion
,那么你的代码就是在错误的解释器下运行的。
因为这个评论的格式不太好,
所以在 find_modules.py 这个文件里,我把
REPLACEPACKAGES = {
'_xmlplus': 'xml',
}
改成了
REPLACEPACKAGES = {
#'_xmlplus': 'xml',
}
这样之后,xml 的导入就成功了。
在重新安装和更新了macholib、modulegraph、py2app和setuptools之后,问题依然没有解决。我又仔细查了一下,发现modulegraph模块里有以下错误:
graphmodule.find_modules.find_modules(includes=['xml.etree'])
Traceback (most recent call last):
File "<stdin>", line 1 in <module>
File ".../modulegraph/find_modules.py", line 255 in find_modules
File ".../modulegraph/find_modules.py", line 182 in find_needed_modules
File ".../modulegraph/modulegraph.py", line 401 in import_hook
File ".../modulegraph/modulegraph.py", line 464 in load_tail
ImportError: No module named xml.etree
于是我进一步研究了load_tail
和import_hook
这两个函数,发现它在导入xml包时没有问题,但却去找一个旧版本的_xmlplus来寻找etree这个子包(当然找不到了)。我把_xmlplus这个包删掉后,错误就消失了,接着我用下面的setup.py文件成功让应用程序运行起来:
from setuptools import setup
import xml.etree.ElementTree
setup(name="Mac XML Test",
app=['macxml.py'],
options={'py2app': {'includes': ['xml.etree.ElementTree']}},
data_files=[('', ['lib.xml'])]
)
输出结果会显示在控制台上。