关于python:py2app和xml.etree.ElementTree

py2app and xml.etree.ElementTree

我正在尝试使用Python的内置xml.etree.elementTree类构建一个使用一些XML数据的应用程序。当我从命令行运行时,它可以正常工作,但是当我构建它时,我会得到一个错误"importError:no module etree.elementtree"。我猜这是因为我没有正确导入该模块,但是我还没有弄清楚如何导入。当我使用"includes"或"packages"指令时,py2app会抱怨同样的错误,当我特别指定package_dir(/system/library/…)时,它会编译,但仍然会给出错误。我用了一个简短的例子来说明这个问题。

MacXML.py版

1
2
3
4
5
from xml.etree.ElementTree import ElementTree

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

这应该打印出"",其中library是根名称。

设置.py

1
2
3
4
5
from setuptools import setup

setup(name="Mac XML Test",
      app=['macxml.py'],
     )

什么是使Mac应用程序使用此库的正确方法?

Python2.6.4

Mac OS X 10.6.2版

编辑:我也在另一台Mac(PPC10.5.8)上用python 2.6.2进行了尝试,并取得了相同的结果。


因为评论没有很好的格式,

在find eu modules.py中,我更改了

1
2
3
REPLACEPACKAGES = {
    '_xmlplus':     'xml',
}

1
2
3
REPLACEPACKAGES = {
    #'_xmlplus':     'xml',
}

XML导入工作正常。


在重新安装和更新macholib、modulegraph、py2app和setuptools后,我做了更多的挖掘,发现modulegraph模块中存在以下错误:

1
2
3
4
5
6
7
8
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文件:

1
2
3
4
5
6
7
8
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'])]
     )

输出显示在控制台中。


如果您使用的是MacPorts(或Fink等),请确保py2app使用的是正确的解释器。您可能需要安装一个新版本才能使用2.6.x(在OS X 10.5上,py2app使用2.4.x)。

如果这不起作用,我解决路径问题的步骤是:

  • 启动代码(或py2app使用的python解释器(您绝对确定吗??试试which python)
  • 江户十一〔四〕号
  • 如果第2步。在/System/Library..someotherpythonversion中给您一个路径,您的代码运行在错误的解释器中。