py2app与xml.etree.ElementTree

2 投票
3 回答
1393 浏览
提问于 2025-04-15 18:44

我正在尝试用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 个回答

0

如果你在使用macports(或者fink等工具),要确保py2app使用的是正确的解释器。你可能需要安装一个新版本来支持2.6.x(在OS X 10.5上,py2app使用的是2.4.x)。

如果这样还不行,我处理路径问题的步骤是:

  1. 启动你的代码(或者py2app)所用的python解释器(你确定吗?可以试试输入which python来确认)。
  2. import sys; print sys.path

如果第二步显示的路径是/System/Library..someotherpythonversion,那么你的代码就是在错误的解释器下运行的。

1

因为这个评论的格式不太好,

所以在 find_modules.py 这个文件里,我把

REPLACEPACKAGES = {
    '_xmlplus':     'xml',
}

改成了

REPLACEPACKAGES = {
    #'_xmlplus':     'xml',
}

这样之后,xml 的导入就成功了。

1

在重新安装和更新了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_tailimport_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'])]
     )

输出结果会显示在控制台上。

撰写回答