py2app和xml.etree.ElementTree

时间:2010-02-01 18:44:32

标签: python xml py2app

我正在尝试使用Python的内置xml.etree.ElementTree类构建一个使用一些xml数据的应用程序。当我从命令行运行时,它正常工作,但是当我构建它时,我收到一个错误“ImportError:No module etree.ElementTree。”我猜这是因为我没有正确导入该模块,但我无法弄清楚如何。当我使用“includes”或“packages”指令时,py2app会抱怨同样的错误,当我专门指定package_dir(/ System / Library / ...)时,它会编译,但仍然会给我错误。我举了一个简短的例子来说明这个问题。

macxml.py

from xml.etree.ElementTree import ElementTree

if __name__ == '__main__':
    tree = ElementTree()
    print tree.parse('lib.xml')

这应打印出“< 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

编辑:我也尝试使用Python 2.6.2在另一个mac(PPC 10.5.8)上实现了这一点并获得了相同的结果。

3 个答案:

答案 0 :(得分: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'])]
     )

输出显示在控制台中。

答案 1 :(得分:1)

由于评论没有良好的格式化,

在find_modules.py中我改变了

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

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

xml导入工作正常。

答案 2 :(得分: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
  3. 如果第2步为您提供/System/Library..someotherpythonversion中的路径,则您的代码在错误的解释器中运行。